簡體   English   中英

使用派生類型作為Java中的參數重載方法

[英]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);
}

並且具有BaseDerived實現,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM