[英]Method overloading using derived types as parameters in Java
假設我已經擴展了現有代碼,但也避免盡可能地更改代碼。
在這個代碼的某處,有一個接收某種類型的方法。
Engine.method(Base b)
現在,我想擴展此功能。 所以我將Base擴展為一個名為Derived的類型,它包含了我需要的更多數據,並且我還實現了另一個接收Derived類型並使用它做一些不同的方法。
Engine.method(Derived d)
但我不想將原來的呼叫改為“方法”。 我以某種方式設法通過使用標志來實現正確的類型(Base或Derived),但由於原始調用采用Base,因此我的新方法將不會被調用。
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())
}
但你能想到更好的東西嗎?
謝謝
這是因為Java使用單一調度。 這結束意味着在您的情況下,調用的方法取決於引用的類型“b”,它是Base,而不是“b”所包含的實例的類型。 因此,將始終調用方法xpto。(Base b)。
你真的必須使用你編寫的最后一種方法。
寫這個:
class Engine {
public static void method(Base argument) {
if (argument instanceof Derived) {
// ...
}
else {
// ...
}
}
}
但是,您可能應該擴展Engine
類以允許更多的多態性,例如執行以下操作:
interface Engine<T extends Base> {
void method(T argument);
}
並且具有Base
和Derived
實現,如下所示:
class BaseEngine implements Engine<Base> {
@Override
public void method(Base argument) { ... }
}
class DerivedEngine implements Engine<Derived> {
@Override
public void method(Derived argument) { ... }
}
為什么不簡單地用正確類型的參數調用方法?
Base b = null;
if (flag) {
Derived d = new Derived()
Engine.method(d); // so the correct method will be used for Derived
b = d;
} else{
b = new Base()
Engine.method(b)
}
您還可以考慮重用該method(Base b)
:
public void method(Derived d) {
method((Base)b);
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.