2016-04-29 14 views
2

Я новичок в Java, и я пытаюсь сделать некоторые действительно простые приложения Java. В моих попытках я столкнулся с проблемой обобщения. У меня есть список Лицо объектов. Лицо может быть От или Мать.Java Passing Type как параметр в функцию, ожидающий подтип

Тогда у меня есть несколько методов с тем же именем есть (...), но они отличаются входными параметрами. Эти методы не входят в состав Лицо класс. Один из этих методов принимает Мать как параметр, а другая принимает Отец.

Вопрос заключается в том, как динамически решать, какой метод вызывать в списке Лицо. когда я пытаюсь перебор списка и вызов o.eat (итератор) это предлагающее с ошибкой компилятора, потому что итератор типа Person но мои едят методов хотят Матерей или Отца в качестве параметров. Компилятор не знает, что у меня есть метод для каждого типа Person

До сих пор я решил мою проблему с если заявление, в котором я сравниваю тип класса по GetType() метод как с Матери и Отец, и если он равен, я могу лить Лицо в соответствующий тип.

код выглядит следующим образом:

if (person.getClass().equals(Father.class)) { 
      theView.eat((Father) person); 
     } 


    if (person.getClass().equals(Mother.class)) { 
      theView.eat((Mother) person); 
     } 

Ешьте метод выглядит следующим образом:

public void eat(Mother m){ 
    textArea.append(m.breakfast); 
    textArea.append(m.lunch); 
    textArea.append(m.dinner); 
} 

обед ужин и завтрак только некоторые строки с указанием того, что человек делает

человек является код является итератором по списку объектов Лица

Is t здесь любое лучшее решение, которое автоматизирует процесс?

Thx заранее.

+2

Это может помочь, если включить код в ваш вопрос, чтобы продемонстрировать вашу проблему. – khelwood

+0

Я действительно не понимаю, что он здесь делает:/ – Seth

ответ

1

Тогда, у меня есть несколько методов, с таким же названием едят (...), но они различаются по входным параметрам

Что делать, если ваш класс с различными eat методами реализуется следующим образом:

public class TheView<T extends Person> { 
    public void eat(T t) { 
     textArea.append(t.getMeals()); 
    } 
} 

И теперь ваш метод итерации может быть реализован следующим образом:

public <T> void yourMethod(List<? extends Person> personList) { 
    for (Person p : personList) { 
     theView.eat(p); 
    } 
} 

Ваш список может содержать любое количество Father или Mother объектов, предусмотренных они реализуют/продлить Person класс как

public abstract class Person { 
    private String breakfast; 
    private String lunch; 
    // ... other fields 

    public abstract void getMeals(); 

    public String getBreakfast() { return breakfast; } 
    // ... other getters 
} 

public class Father extends Person { 
    @Override 
    public void getMeals() { 
     // implement Father-specific code here 
    } 
} 

public class Mother extends Person { 

    @Override 
    public String getMeals() { 
     StrngBuilder sb = new StringBuilder() ; 

     sb.append(getBreakfast()); 
     sb.append(getLunch()); 
     sb.append(getDinner()); 

     return sb.toString(); 
    } 
} 
+0

, но как я могу сказать, передана ли мать или отец методу (T t)? потому что я хочу делать разные действия с Отцом, чем с матерью. – Jenism

+0

'eat()' не нужно знать, какой конкретный тип передан, кроме как он имеет тип 'Person'. См. Измененный код выше, чтобы понять, что я имею в виду. – ujulu

+0

, но в этом методе есть, я хочу добавить текст в список. поэтому я не могу сделать это в модели calsses матери и отца :(его немного беспорядочно знаю – Jenism

1

Использование полиморфизма:

public interface Person{ 
    void eat(); 
} 

public class Mother implements Person{ 

    @Override 
    public void eat() 
    { 
     //the code inside eat(Mother) goes here 
    } 

} 

public class Father implements Person{ 

    @Override 
    public void eat() 
    { 
     //the code inside eat(Father) goes here 
    } 

} 

тогда, просто вызвать метод съедать по каждому объекту список вашего лица:

for(final Person person: personList){ 
    person.eat(); 
} 
+0

спасибо за ответ, проблема в том, что метод eat не является членом Person, но Person является аргументом метода eat. Метод eat является членом объекта, который отвечает за представление приложения. – Jenism

0

Я думаю, что вам нужен шаблон для посетителей, из-за того, что вы сказали здесь

Вопрос заключается в том, как динамически решать, какой метод вызывать на список лиц.

https://sourcemaking.com/design_patterns/visitor/java/2

Это поможет вам решить, какой маршрут принять динамически во время выполнения

Материал из Википедии: https://en.wikipedia.org/wiki/Double_dispatch

двойной доставки специальная форма множественной диспетчеризации и механизм, который отправляет вызов функции различным конкретным функциям в зависимости от типов времени выполнения двух объектов, участвующих в вызов.

 Смежные вопросы

  • Нет связанных вопросов^_^