2012-12-19 61 views
2

可能重複:
Java Overload method with inherited interface如何強制Java的動態方法調用結合

我還不能肯定我的標題是正確的,但我敢肯定,我會,如果被糾正不是。

我試圖重載helpIt方法,像這樣:

class Animal{} 
class Dog extends Animal{} 

class Foo implements AnimalHelper 
{ 
    @Override 
    public void helpAnAnimal(Animal a) 
    { 
    helpIt(a); 
    } 

    private void helpIt(Dog d) 
    {} 

    private void helpIt(Animal a) 
    {} 
} 

問題是這樣從來沒有調用helpIt(狗d)方法,即使在動物是狗。 我使用這種方法是因爲類Foo覆蓋了AnimalHelper的helpAnAnimal方法。

我在這裏錯過了什麼嗎?我希望我不必檢查instanceof然後施放它。 我相信這在.Net的框中很有用,但內存有點褪色,可能不正確。

+0

在編譯時,Java將Dog視爲動物(請參閱:http://stackoverflow.com/questions/1601365/java-overload-method-with-inherited-interface)。 – sdasdadas

+0

我認爲你的問題已經在這裏得到解答 http://stackoverflow.com/questions/11110631/java-overloading-and-inheritance-rules – MatthiasLaug

回答

2

充分利用helpIt()方法Animal可重寫的實例方法:

class Foo implements AnimalHelper { 
    @Override 
    helpAnAnimal(Animal a) { 
     a.helpIt(); 
    } 
} 

或者使用visitor pattern

public interface AnimalVisitor { 
    void visitDog(Dog d); 
    void visitOther(Animal a); 
} 

public class Animal { 
    public void accept(AnimalVisitor visitor) { 
     visitor.acceptOther(this); 
    } 
} 

public class Dog extends Animal { 
    public void accept(AnimalVisitor visitor) { 
     visitor.acceptDog(this); 
    } 
} 

class Foo implements AnimalHelper { 
    @Override 
    helpAnAnimal(Animal a) { 
     a.accept(new AnimalVisitor() { 
      public void visitDog(Dog d) { 
       helpIt(d); 
      } 
      public void visitOther(Animal a) { 
       helpIt(a); 
      } 
     }); 
    } 

    private void helpIt(Dog d) { 
    } 

    private void helpIt(Animal a) { 
    } 
} 
+0

謝謝。我以前從未使用它,但我喜歡訪問者模式,因爲它保留了我想要的功能並允許多個實現。 – rediVider

1

你不能這樣做,因爲Java在編譯時將它們看作動物。

你可以做的是添加與動物/狗具體到實際的狗類的算法,例如:

class Animal { 

    protected boolean hasRabies() { 
     return animal.name.equals("Tim"); 
    } 
} 

class Dog { 

    @Override 
    protected boolean hasRabies() { 
     return false; // Apparently dogs can't have rabies? 
    } 
} 

然後你就可以調用helpAnimal這些具體方法:

private void helpIt(Animal a) { 
    if (a.hasRabies()) { 
     a.setTreats(4000); 
    } else { 
     a.setTreats(3000); 
    } 
} 

我不是獸醫。

0

一些東西在這裏:

  • 的Java肯定贏因爲第一次打電話給helpIt(Dog d)方法變量a的類型爲Animal。您必須手動檢查並調用正確的方法。這實際上是一種類型向下/向上鑄造的情況。不知道.Net雖然。

  • Foo假設是什麼?它是輔助班嗎?如果是這樣,我不會實現一個接口,我會放棄構造函數並公開私有方法。這樣您可以直接使用它們並避免手動投射。

  • 或者Java是一種面向對象的語言,因此如果helpItAnimal的行爲,我會將該方法移到Animal類中,並將輔助類放在一起。

1

你是否從相同類的方法調用helpIt(Dog d)?

請注意,您對這些方法使用了私有方法,您將無法在此類之外使用這些方法。