2015-05-30 96 views
0

我有一個由Student和Employee繼承的類Person。 我有另一個類PersonList,它具有類人,即列表的列表(元素既可以是學生和員工類型)如何在不使用instanceOf或getClass()的情況下知道類的類型?

有它有兩個重載方法,即

void display(Employee emp)void display (Student student)第三方API

當我迭代Person列表時,我需要知道對象類型,以便可以調用相應的display()方法。

我不想使用instanceOf或getClass()。

+0

爲什麼你有這些限制? –

+0

問題是在這個迭代中你必須知道使用這兩種方法之一的特殊實現。一個更好的解決方案是你爲每個實現實現的接口'public interface PersonInterface {public void display(); }' – pL4Gu33

+0

今天在接受採訪時我被問到了這個問題。自從我回家2個小時後,我想不出第三種方式。 :) –

回答

3

一般來說,這種情況下的第三方API設計的很糟糕。特別是如果你被允許改變它依賴的類...

但無論如何,如果你被允許改變類,你可以添加一個方法,如displayMe(我假設你的第三方類被稱爲PersonPrinter )。

abstract class Person { 
    abstract public void displayMe(); 
} 

class Employee extends Person { 
    public void displayMe() { 
     PersonPrinter.display(this); 
    } 
} 

class Student extends Person { 
    public void displayMe() { 
     PersonPrinter.display(this); 
    } 
} 

由於每個類都知道它是什麼,它會從PersonPrinterdisplay正確的版本。

現在你可以寫你的循環是這樣的:

List<Person> personList = new ArrayList<>(); 
    personList.add(new Employee()); 
    personList.add(new Student()); 
    for (Person p : personList) { 
     p.displayMe(); 
    } 
+0

完美,謝謝:) –

相關問題