2

スーパークラス Animal (犬、猫、マウスなど) を実装する多くのサブクラスがあります。

私もです:

Animal[] arrayOfAnimals = new Animal[100];

犬、猫などのオブジェクトを入れました。

私はそれから何かを得るとき、私はそうします

If(arrayOfAnimals[1] instanceof Dog) {
    ((Dog)(arrayOfAnimals[1])).speak();
}

else if(arrayOfAnimals[1] instanceof Cat) {
    ((Cat)(arrayOfAnimals[1])).speak();
}

その動物が猫なのか犬なのかを知る必要があるからです。

ここで、動物のサブクラスが多数あると仮定すると、多くの「else if...」が連続して取得されます。

私の質問は次のとおりです。これを回避する方法はありますか? 私はすでにインターフェース(動物 - >インターフェース、動物を実装する犬、猫など)を使用しようとしましたが、私のプロジェクトでは配列は複製可能でなければならず、動物がインターフェイス (その配列内のオブジェクトは複製されません)

4

2 に答える 2

9

その動物が猫なのか犬なのかを知る必要があるからです。たとえば、それぞれの話し方が異なるからです。

これは実装の詳細のように思えます。すべての動物が何らかの形で話すことができる場合は、speak()メソッドをAnimal抽象メソッドとして配置する必要があります。各サブクラスはそれをオーバーライドして実装を提供します。それからあなたはただ使うことができます

arrayOfAnimals[1].speak();

...そして、ポリモーフィズムは適切な実装を使用して処理します。

ところで、インターフェイスタイプの配列を複製できます:

interface Foo {
}

class FooImpl implements Foo {
}

public class Test {
    public static void main(String[] args) {
        Foo[] foos = { new FooImpl() };

        Foo[] clone = (Foo[]) foos.clone();
        System.out.println(foos[0] == clone[0]); // true
    }
}

関連する型に関係なく、clone()配列を呼び出しても各要素は複製されないことに注意してください。新しい配列には、古い配列と同じ参照が含まれます。浅いコピーです。それを行いたい場合は、自分でコーディングする必要があります (またはサードパーティのライブラリを見つけます)。

于 2012-05-23T18:23:16.453 に答える
1

speak() をスーパークラスに移動して、サブクラスにオーバーライドさせてみませんか?

于 2012-05-23T18:23:50.230 に答える