2013-05-21 3 views
0

Я видел что-то похожее на это с помощью наследования, но я хочу использовать интерфейс Я хочу создать один 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); 
} 

`

+4

Мне сложно понять, в чем ваш вопрос. Это также помогло бы потенциальным ответчикам, если бы ваш исходный код был отформатирован и не имел синтаксических ошибок (например, «... новый ArrayList ;' должен быть '... новым ArrayList ();' с круглыми скобками в конце). – Nick

+1

Я думаю, что ответ «да». Вы можете использовать интерфейс как параметр типа. Вообще говоря, лучший способ ответить на этот вопрос - это просто попробовать себя. – jpmc26

+0

Вам не хватает большого количества кода, который может помочь прояснить. Поскольку Ник предложил очистить его и завершить, и, возможно, мы сможем помочь. Ваш код, похоже, не соответствует вашему вопросу. По существу «Могу ли я сделать следующее:» ответят «Нет», поскольку следующий код не ест уток и не удаляет уток из каких-либо списков. – galford13x

ответ

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).

Это то, что вы хотели знать?

+0

Правильно. Спасибо. Я хочу в принципе создать строки уток и гусей автоматически через вход. Входы пользователя numRows & numCols. Каждая строка будет заполнена случайным образом гусиными и утиными объектами в списке массивов, чтобы я мог перемещаться по каждому животному один за другим. Как только вы съедите первое животное, вы перейдете ко второму .... –

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); 
} 

Вам потребуется либо 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(); 
    } 

Не стесняйтесь прокомментировать, если я что-то пропустил.

+0

Помогает, спасибо. извините за ошибки Я хочу в принципе создать строки уток и гусей автоматически через вход. Входы пользователя numRows & numCols. Каждая строка/столбец будет заполняться случайным образом с помощью объектов гуся и утки в списке массивов, чтобы я мог поочередно перебирать каждое животное. Как только вы съедите первое животное, вы перейдете ко второму ... ТАК каждая строка и столбец перебирают список массивов одновременно –