2

重複の可能性:
継承されたインターフェースを持つ 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 )
  {}
}

問題は、動物が Dog であっても、これが helpIt( Dog d ) メソッドを決して呼び出さないことです。このアプローチを使用したのは、クラス Foo が AnimalHelper の helpAnAnimal メソッドをオーバーライドするためです。

ここで何か不足していますか?instanceof をチェックしてからキャストする必要がないことを願っています。これは .Net で問題なく動作したと思いますが、その記憶は少し薄れており、おそらく正しくありません。

4

4 に答える 4

2

メソッドhelpIt()を のオーバーライド可能なインスタンス メソッドにしAnimalます。

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

または、ビジター パターンを使用します。

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) {
    }
}
于 2012-12-19T20:45:29.847 に答える
1

Java はコンパイル時にそれらすべてを動物と見なすため、これを行うことはできません。

できることは、実際の Dog クラスに固有の Animal / Dog であるアルゴリズムを追加することです。次に例を示します。

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);
    }
}

私は獣医師ではありません。

于 2012-12-19T20:43:56.477 に答える
1

同じクラスのメソッドから helpIt(Dog d) を呼び出していますか?

メソッドに private を使用したため、これらのメソッドをこのクラスの外では使用できないことに注意してください。

于 2012-12-19T20:48:55.867 に答える
0

ここにいくつかのものがあります:

  • helpIt(Dog d)変数aが type であるため、 Java は間違いなくメソッドを呼び出しませんAnimal。正しいメソッドを手動で確認して呼び出す必要があります。これは、タイプのダウン/アップ キャストの場合です。ただし、.Netについてはわかりません。

  • フーは何だと思いますか?ヘルパークラスですか?もしそうなら、インターフェースに実装しないなら、コンストラクターを削除して、プライベート メソッドをパブリックにします。このようにして、それらを直接使用して手動キャストを回避できる場合があります。

  • 別の方法として、Java はオブジェクト指向言語であるため、そのhelpIt動作である場合はAnimal、メソッドを Animal クラスに移動し、ヘルパー クラスをまとめて削除します。

于 2012-12-19T20:48:37.200 に答える