在Java中重写对象示例的final类的final方法

vsaztqbk  于 2023-08-01  发布在  Java
关注(0)|答案(2)|浏览(102)

我们现在的情况是,我们有一个类“Base”,它有一个最终的toString()方法。
我们还有一个最终类“Sub”,它扩展了“Base”。
有一个要求,要做一个非常具体的变化,只适用于一个极小的功能子集,但可以得到相当侵扰,如果做得“正确”。
实现更改的最简单方法是在“Sub”类的单个示例上覆盖toString方法。创建一个新的带有toString()重写的Sub示例也是一个选项。
这可能吗?有什么建议吗?

vmdwslir

vmdwslir1#

如果你不能改变Base类,删除final修饰符或改变toString实现以委托给子类,你最好的办法是添加和使用接口:让BaseSub实现相同的接口,在任何地方使用该接口,然后使用composition做你需要做的事情:

class Delegate implements CommonInterface {
  private Base delegate;
  // ++ ctor

  public String toString() {
    return delegate.toString(); // here you are free to change the toString.
  }
}

字符串

pbgvytdp

pbgvytdp2#

如果Java中的任何方法是final的,子类就不能覆盖final方法。如果你坚持在Sub中使用toString(),那么只有一种方法。使基类的toString()不是final。
或者是
在你的Sub类中取一个非静态的final全局变量,并使用构造函数初始化它,只要需要打印Sub类的示例,就可以打印所需的字段。

相关问题