我们现在的情况是,我们有一个类“Base”,它有一个最终的toString()方法。我们还有一个最终类“Sub”,它扩展了“Base”。有一个要求,要做一个非常具体的变化,只适用于一个极小的功能子集,但可以得到相当侵扰,如果做得“正确”。实现更改的最简单方法是在“Sub”类的单个示例上覆盖toString方法。创建一个新的带有toString()重写的Sub示例也是一个选项。这可能吗?有什么建议吗?
vmdwslir1#
如果你不能改变Base类,删除final修饰符或改变toString实现以委托给子类,你最好的办法是添加和使用接口:让Base和Sub实现相同的接口,在任何地方使用该接口,然后使用composition做你需要做的事情:
Base
final
toString
Sub
class Delegate implements CommonInterface { private Base delegate; // ++ ctor public String toString() { return delegate.toString(); // here you are free to change the toString. } }
字符串
pbgvytdp2#
如果Java中的任何方法是final的,子类就不能覆盖final方法。如果你坚持在Sub中使用toString(),那么只有一种方法。使基类的toString()不是final。或者是在你的Sub类中取一个非静态的final全局变量,并使用构造函数初始化它,只要需要打印Sub类的示例,就可以打印所需的字段。
2条答案
按热度按时间vmdwslir1#
如果你不能改变
Base
类,删除final
修饰符或改变toString
实现以委托给子类,你最好的办法是添加和使用接口:让Base
和Sub
实现相同的接口,在任何地方使用该接口,然后使用composition做你需要做的事情:字符串
pbgvytdp2#
如果Java中的任何方法是final的,子类就不能覆盖final方法。如果你坚持在Sub中使用toString(),那么只有一种方法。使基类的toString()不是final。
或者是
在你的Sub类中取一个非静态的final全局变量,并使用构造函数初始化它,只要需要打印Sub类的示例,就可以打印所需的字段。