实现接口的不同对象的列表

时间:2013-05-21 19:59:44

标签: java list object interface

我使用继承看到类似的东西,但我想使用一个接口 我想创建一个由不同对象组成的单个arraylist。 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);
}

`

2 个答案:

答案 0 :(得分:1)

你的代码对我来说毫无意义。我想我明白你想要的是什么。首先让我们来看看你的代码。

你有一个Goose类来实现Animal,这很好。然后,您在类中有一个名为link的列表:

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

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

然后你有两个构造函数:

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

您需要DuckGoose作为输入,并将其添加到新Goose的内部列表中。这意味着每个新实例将从其列表中的DuckGoose开始。您似乎希望构造函数为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
    }
}

然后,您可以将linkg2g3移至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的类的属性,以扩大范围。如果您需要全局访问权限,可以创建一个包含它的singleton类(或者在某处创建public static,但我建议采用其他方法。)

如果Duck类正确实现Duck接口,您还可以在列表中添加Animal

link.add(new Duck());

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

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

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

答案 1 :(得分:0)

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

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接口)。

那是你想知道的吗?