2

我有许多子类实现超类动物(狗、猫、老鼠等)

所以我这样做:

Animal[] arrayOfAnimals = new Animal[100];

我把狗、猫等物体放进去。

当我从中得到一些东西时,我会做

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

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

因为我需要知道那个动物是猫还是狗,因为例如,每个人的说话方式都不一样。

现在假设我有很多 Animals 子类,我会连续得到很多“else if...”

我的问题是:有没有办法避免这种情况?我已经尝试过使用接口(Animal -> 接口、Dog、Cat 等实现动物),但在我的项目中,数组必须是可克隆的,如果 Animal 是接口(该数组内的对象不会被克隆)

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 回答