我使用继承看到类似的东西,但我想使用一个接口
我想创建一个由不同对象组成的单个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);
}
`
答案 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);
}
您需要Duck
或Goose
作为输入,并将其添加到新Goose
的内部列表中。这意味着每个新实例将从其列表中的Duck
或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
都包含另外两只叫做g3
和g2
的鹅,它们也没有多大意义(除非它们被用作鹅的父母的参考,但是似乎并非如此)。
我认为您想要什么以及如何实现它:您需要修改Goose
课程,以便每只鹅只有每个鹅的成员相关。它可能看起来像这样(假设动物界面声明了eat()
方法):
public class Goose implements Animal {
@Override
public void eat() {
// Om nom nom
}
}
然后,您可以将link
,g2
和g3
移至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接口)。
那是你想知道的吗?