【问题标题】:List of different objects that implement an interface [closed]实现接口的不同对象列表[关闭]
【发布时间】:2013-05-21 19:59:43
【问题描述】:

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

`

【问题讨论】:

  • 我很难理解你的问题是什么。如果您的源代码已格式化并且没有语法错误(例如,...new ArrayList&lt;Animal&gt;; 应该是 ...new ArrayList&lt;Animal&gt;();,末尾有括号),这也将有助于潜在的回答者。
  • 我认为答案是“是的”。您可以将接口用作类型参数。一般来说,回答这类问题的最好方法就是自己尝试一下。
  • 您遗漏了很多可能有助于澄清的代码。正如尼克建议的那样清理并完成它,也许我们可以提供帮助。您的代码似乎与您的问题不符。本质上,“我可以执行以下操作吗:”将回答否,因为以下代码不吃任何鸭子,也不会从任何列表中删除任何鸭子。
  • 是的,你可以定义一个名为Animal的接口,它允许你声明一个ArrayList,其中包含任何实现Animal的对象。但是,您的代码中的语法不正确。
  • 这里是an answer,这与您想做的事情有些相关。

标签: java list object interface


【解决方案1】:

您的代码对我来说毫无意义。我想我明白你想要什么。首先让我们检查一下您的代码。

你有一个实现AnimalGoose 类,这很好。然后你在类中有一个名为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);
}

您需要 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);
    ..

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

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

link.add(new Duck());

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

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

如果我遗漏了什么,请随时发表评论。

【讨论】:

  • 帮助,谢谢。抱歉,我想基本上通过输入自动创建成排的鸭子和鹅。用户输入 numRows 和 numCols。每行/列将随机填充数组列表中的鹅和鸭对象,因此我可以逐个遍历每只动物。一旦你吃了第一只动物,你就会去第二只。所以每一行和每一列都在迭代同时抛出它的数组列表
【解决方案2】:

您的代码有一些错误。对于 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接口)。

这是你想知道的吗?

【讨论】:

  • 正确。谢谢你。我想基本上通过输入自动创建成排的鸭子和鹅。用户输入 numRows 和 numCols。每行将随机填充数组列表中的鹅和鸭对象,这样我就可以一个一个地遍历每只动物。一旦你吃了第一只动物,你就去吃第二只……
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多