2012-12-20 422 views
2

當我嘗試創建類的實例並將其添加到我的ArrayList時,我無法調用子類中定義的方法。Java調用子類方法

我該如何做這項工作?

List類

import java.util.*; 
public class List { 
    private ArrayList<Person> persons; 
    public List(){ 
    persons = new ArrayList<Person>(); 
    } 
    public void addAssistant(){ 
    Person person = new Assistant(); 
    persons.add(person); 
    if(person instanceof Assistant){ 
     person.assist(); 
    } 
    } 
} 

Person類

public class Person { 
    public Person(){} 
} 

助理類

public class Assistant extends Person { 
    public Assistant(){} 
    public void assist(){ 
    System.out.println("I am assisting!"); 
    } 
} 

Ç ompiler: line:person.assist();在List類的addAssistant()方法中。

編譯錯誤: 編譯器找不到符號 - 方法assist()。

+0

我不會把一個類列表,我會用接口 – NimChimpsky

+0

不直接關係到你的問題:如果一個助手,一個人,你可能要考慮,或者如果它是一個人的角色。 –

+0

我可以,但它是一堆代碼,高於一個簡單的版本,以保持易讀。它在行中出錯:person.assist();在List類的addAssistant()方法中。編譯器找不到符號 - 方法assist()。 – rofavadeka

回答

8

你需要一個明確的轉換:

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 

不過,我認爲這種類型的邏輯一般應勸阻。

+0

謝謝。如果我更熟悉java語言,我會記住找到另一種方法!它現在工作正常。 – rofavadeka

1

你有你的Person鑄成Assistant這樣的:

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 

這種類型的鑄造howerver是有缺陷的應用程序設計的指示,我認爲。

只是一個旁註:

您應該使用接口,而不是具體實現。與此

private ArrayList<Person> persons; 

:所以,你應該更換此

private List<Person> persons; 

如果你希望你的Person s到做他們的具體工作和Assistant的工作是幫助比你可以工作在此通過創建抽象方法在Person

public abstract void doYourWork(); 

,並可以實現在Assistant

@Override 
public void doYourWork(){ 
    // doing something 
} 

在這種情況下,你不必明確地投你Person對象。

如果Person不會有任何具體的實現,您可以改爲使其成爲一個接口。

+0

感謝您的深入解釋。 – rofavadeka

1

您需要爲使用一個鑄件的子方法

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 
+0

謝謝你的努力,回答所有已經給出的答案。 – rofavadeka

0

的方式Java語言的設計,這並不編譯(因爲你已經理解了它也一樣)。這樣想想,所有的助手都是人,但並不是所有的人都是助手。如果你使用明確的演員,你可以做你想做的事情(就像NPE在他的回答中提到的那樣)。

+0

感謝您的回覆。 – rofavadeka

1

Person類不具有輔助定義的方法,所以你必須明確地轉換爲助理類如

if(person instanceof Assistant){ 
    ((Assistant)person).assist(); 
} 
+0

感謝您的努力,已經給出了答案。 – rofavadeka

1

我會這樣

public void addAssistant(){ 
    Assistant assistant = new Assistant(); 
    assistant.add(person); 
    assistant.assist(); 
} 

有從您最近創建的對象實際上是一個助理的知識提煉自己沒有點代碼吧。

從具體類型中抽象出自己是減少兩段代碼之間的耦合的好方法,它對於做多態這樣的好事是必要的......但在這個特定的例子中,你向我們展示了你已經緊密耦合到一個助手(實際上你只是將它實例化爲兩行以上)。

實現這個另一種可能的方法是使用多態,你可以通過添加輔助()方法來你的人的界面做的。

public class Person { 
    public Person(){} 

    public void assist() { 
    //I'm a just a person who doesn't assist anywhere 
    } 
} 

這樣你將能夠做你正在嘗試:

public void addAssistant(){ 
    Person person = new Assistant(); 
    persons.add(person); 
    person.assist();  
} 

不過,我不會建議,大多是因爲你將開始與責任盡顯你的個人界面,沒有正確放置在那裏。這完全是設計問題,您需要爲您的特定問題選擇更好的(當然也是最舒適的)解決方案。

好運 克勞迪奧