假设我有现有的代码,我想扩展它,但又想尽可能避免更改它。
这段代码周围有一个接收某种类型的方法。
Engine.method(Base b)
现在,我想扩展这个功能。因此,我将 Base 扩展为一个名为 Derived 的类型,它包含我需要的更多数据,并且我还实现了另一个方法来接收 Derived 类型并用它做一些不同的事情。
Engine.method(Derived d)
但我不想改变原来对“方法”的调用。我以某种方式设法通过使用标志来实例化正确的类型(基类或派生类),但由于原始调用采用基类,所以我的新方法将不会被调用。
Base b = null;
if(flag) {
b = new Derived()
} else{
b = new Base()
}
Engine.method(b)
问题是现在我的 Engine.method(Derived d) 将不会被调用。我通过使用铸造解决了这个问题
if(flag)
Engine.method((Derived)b)
但这是错误和愚蠢的。有什么建议么?
我总能做到:
if(flag) {
Engine.methodForBase(new Base())
} else{
Engine.methodForDerived(new Derived())
}
但你能想出更好的办法吗?
Thanks
发生这种情况是因为 Java 使用单一调度。这意味着在您的情况下,调用的方法取决于引用“b”的类型(即 Base),而不是“b”所持有的实例的类型。因此,方法 xpto.(Base b) 将始终被调用。
您确实必须投射它或使用您编写的最后一种方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)