2013-05-12 30 views
0

我對我的Java相當生疏,我有一個很難用下面的:Java繼承:超類被「重寫」的子類的功能與不同的簽名

public abstract class Animal implements Comparable<Animal> { 

    //enum stored elsewhere 
    AnimalType type = null; 

    private specificCompare(Animal a){ 
     return 0; 
    } 

    @Override 
    public int compareTo(Animal a){ 
     int comp = type.compareTo(a.type); 
     if (comp > 0) { 
      return 1; 
     } else if (comp < 0) { 
      return -1; 
     } else { 
      return specificCompare(a); 
     } 
    } 
} 

public class Mammal extends Animal { 
    private mammalStuff; 

    public Mammal(){ 
     ... 
    } 

    public specificCompare(Mammal m){ 
     //do specific comparison 
    } 
} 

所以,我明白了爲什麼哺乳動物的specificCompare沒有被調用(不正確的類型),但我試圖找出一個乾淨的方式來完成這項工作。我希望能夠擴展Animal並在需要時正確調用特定比較。

除了實際的答案,如果有人曾建議文檔,我在這讀書,我會很高興有一個鏈接到它。

+0

你希望每個班'Animal'來定義自己的'specificCompare()',對吧?你當前的代碼不起作用?你不想要的是什麼? – acdcjunior 2013-05-12 22:11:15

+3

重寫specificCompare(Animal a)而不是重新定義它。它在超級類中是私人的,使它受到保護。 – 2013-05-12 22:12:09

+0

@acdcjunior:它總是返回0而不是調用Mammal specificCompare。 – useSticks 2013-05-12 22:15:28

回答

3

覆蓋父功能,只投動物參數獸類或任何特定的子類。

public class Mammal extends Animal { 
    private mammalStuff; 

    public Mammal(){ 
     ... 
    } 

    public int specificCompare(Animal a){ 
     Mammal m = (Mammal)a; 
     //do specific comparison 
    } 

你只是調用specificCompare(參見:Animal.compareTo)當你知道這兩個對象都是同一類型,因此這將不會失敗。

+0

通常情況下,最好在嘗試演員前檢查類型。否則,拋出的異常對使用你的代碼的人沒有意義。而且你用這種方式更好地控制程序流程。 – christopher 2013-05-12 22:18:15

+2

該解決方案打破了compareTo的合約。 – 2013-05-12 22:18:42

+0

@acdcjunior這個功能只能用Mammal調用。 – foolmoron 2013-05-12 22:19:44

2

編輯迴應您的評論

嗯,在我看來,如果你只是想比較的類型,不知道他們的具體類,你只能得到作爲Animal準確,無鑄造他們。這是因爲這是所有動物之間最特殊的共同聯繫。你可以做什麼,在Animal提供一個抽象的方法,它具有某種價值。

public int returnType(); 
// Abstract method in Animal class. 

而在Mammal類,它可能是這樣的:

public int returnType() 
{ 
    // Purely an example. 
    return Animal.MAMMAL; 
} 

通過調用你都通過了,你可以瞭解傳遞給你的對象一些獨特的對象returnType,無知道他們的實例類型,並且無需投射。

+0

我的意圖是允許比較動物類型而不需要知道實例以允許稍後添加其他動物類型。 我希望Animal能夠存在,以便所有將添加新動物類型的代碼都將存在於它們自己的SpecificCompare中。 – useSticks 2013-05-12 22:18:10

+0

哦,我明白了..讓我編輯。 – christopher 2013-05-12 22:18:35

+0

看看我的新建議@useSticks – christopher 2013-05-12 22:23:31

0

重寫裝置的方法,所述簽名是完全一樣的。簽名由名稱及其參數組成。你Mammal類不覆蓋specificCompare(Animal a)它正在定義一個新的功能。

如果你想顯式調用在哺乳動物中的功能,你將不得不做一些像specificCompare((Mammal) a)動物的內,然後它會找到正確的簽名。但這顯然不是理想的。

就完全匹配的簽名,所以將其覆蓋,然後進行測試,看是否a是哺乳動物。如果它被施展並且符合你的邏輯。如果不是你應該拋出一個ClassCastException

+0

我也應該注意到,你不能使具體的比較私人,而是至少使它保護,以便它可以被覆蓋。 – cogsmos 2013-05-12 22:21:03