2016-04-29 33 views
2

我是Java新手,我嘗試製作一些非常簡單的Java應用程序。在我的嘗試中,我遇到了泛化的問題。我有一個對象的列表。 可以是父親母親Java Passing Type作爲函數期望子類型的參數

然後,我有幾個同名方法eat(...)但它們在輸入參數上有所不同。這些方法不是類的一部分。其中一種方法接受母親作爲參數,另一種接受父親

問題是如何動態決定在列表上調用哪個方法。當我試圖通過列表迭代並調用o.eat(迭代器)它與編譯器錯誤提示,因爲迭代器是型人的,但我方法要母親父親作爲參數。編譯器完全不認識,我有方法,每種類型的

到目前爲止,我已經解決了我的問題)如果聲明中,我通過的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); 
} 

午餐晚餐和早餐都只是一些字符串,指明什麼人做

人的代碼是通過Person對象列表的迭代器

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

你的列表可以包含任意數量的提供他們實施/擴展PersonFatherMother的對象,如

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噸)?因爲我想和父親做不同的動作 – 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是負責應用程序視圖的對象的成員。 – Jenism

0

我認爲你需要,因爲你在這裏說什麼的訪問者模式,

現在的問題是如何動態地決定在 Person列表上調用哪個方法。

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

這可以幫助你決定要動態地進行路由在運行時

維基百科:https://en.wikipedia.org/wiki/Double_dispatch

雙調度是多分派的一種特殊形式,和 將函數調用分派給不同具體的機制 函數取決於涉及0的兩個對象的運行時類型電話。

相關問題