1

我使用继承看到了与此类似的东西,但我想使用一个接口,我想创建一个由不同对象组成的单个数组列表。ArrayList 包含以下对象 |Duck, Duck, Goose, Duck, Goose, Pig| 我可以随意添加鸭子和鹅。我想这样做,例如,假设我想吃一只鸭子,一旦我吃完鸭子,我就可以吃另一只鸭子并遍历每个项目并运行“吃”方法,例如
|我可以执行以下操作:

public interface Animal {..}

public class Duck implements Animal(){}

public class Goose implements Animal{
     List<Animal> link = new ArrayList<Animal>;

Goose(Duck d){
     link.add(d);
 }
Goose(Goose g){
     link.add(g);
 }
 Goose g3 = new Goose(new Duck);
 Goose g2 = new Goose(g2);
}

`

4

2 回答 2

1

你的代码对我来说完全没有意义。我想我明白你想要什么。首先让我们看看你的代码。

你有一个很好的Goose实现类Animal。然后你有一个link在类中调用的列表:

public class Goose implements Animal{
    List<Animal> link = new ArrayList<Animal>(); //remember ().
    ...

您班级的每个实例Goose都会有一个动物列表。这看起来很奇怪。不过,从这个问题来看,听起来您想要 1 个包含动物的列表,而不是每个列表中的列表Goose

然后你有两个构造函数:

Goose(Duck d){
    link.add(d);
}
Goose(Goose g){
    link.add(g);
}

您需要将 aDuck或 aGoose作为输入添加到 new 的内部列表中Goose。这意味着每个新实例都将从其列表中的 aDuck或 a开始。Goose似乎您希望您的构造函数成为add方法。

最后你有这些:

Goose g3 = new Goose(new Duck()); //You were missing () here also
Goose g2 = new Goose(g2);         //Syntax error. Should probably be ".. new Goose(g3);"

我不完全确定为什么您的Goose班级中有这些,而且它们看起来应该在其他地方声明。因为现在每个都Goose包含另外两只被称为鹅的鹅g3g2这也没有多大意义(除非它们被用作鹅的父母的参考,但似乎并非如此)。

我认为您想要什么以及如何实现它:您需要修改您的Goose类,以便每只鹅只有与每只鹅相关的成员。它可能看起来像这样(假设动物接口声明了一个eat()方法):

public class Goose implements Animal {
    @Override
    public void eat() {
        // Om nom nom
    }
}

然后你可以移动link,g2g3方法main

public static void main(String[] args) {
    List<Animal> link = new ArrayList<Animal>();
    Goose g2 = new Goose();
    Goose g3 = new Goose();

    link.add(g2);
    link.add(g3);
    ..

这样做你只能link在方法中使用列表main。您还可以使其成为包含的类的属性main以扩大范围。如果您需要全局访问,您可以创建一个包含它的单例public static类(或在某个地方创建,但我会推荐另一种方法)。

如果类正确实现了接口,您还可以将 a 添加Duck到列表中:DuckAnimal

link.add(new Duck());

如果Animal接口声明了一个名为的公共方法,eat您现在可以遍历列表并让所有动物吃掉:

    for(Animal a : link) {
         a.eat();
    }

如果我错过了什么,请随时发表评论。

于 2013-05-21T23:57:53.737 回答
0

您的代码有一些错误。对于 Goose 部分,您可以执行以下操作:

public class Goose implements Animal {
List<Animal> link = new ArrayList<Animal>();

Goose(Duck d){
     link.add(d);
 }
Goose(Goose g){
     link.add(g);
 }

public static void main(String... args){
    Goose g3 = new Goose(new Duck());
    Goose g2 = new Goose(g3);
}

}

这意味着如果你有接口 Animal 你可以创建一个 Animal 类型的对象列表并用任何作为 Animal 实例的对象填充它(它的类扩展了 Animal 接口)。

那是你想知道的吗?

于 2013-05-21T22:46:19.120 回答