2012-09-10 21 views
36

我在採訪中被問到如何在不擴展類的情況下實現動態多態。如何才能做到這一點?如何實現動態多態而不擴展類

+3

多態性沒有擴展一個類或多態沒有繼承?無法繼承的 – Santosh

+2

多態性在Java – yegor256

+0

@ yegor256中是不可能的,這就是接口的做法 –

回答

39

Decorator design pattern利用encapsulation是你在找什麼。

多態性通過繼承:

class Cat { 
    void meow() { 
    // meow... 
    } 
} 
class Lion extends Cat { 
} 

多態性通過封裝(裝飾模式):

interface Cat { 
    void meow();  
} 
class Lion implements Cat { 
    private Cat cat; 
    void meow() { 
    this.cat.meow(); 
    } 
} 

PS。關於裝飾器的更多信息:http://www.yegor256.com/2015/02/26/composable-decorators.html

+0

在您對OP的評論中,您聲明,沒有繼承的_多態性在Java_中是不可能的,但在這裏您將通過封裝給出一個多態的例子。這個例子是否與前面的陳述相矛盾? – jaco0646

30

簡單的解決方案是編寫一個實現接口而不是擴展基類的類。

另一種解決方案是創建一個動態代理......這實際上是一種實現接口而不明確寫入類的聰明方式。詳情請參閱Proxy javadoc

是的,這些都是(或可以)裝飾模式的例子,雖然這裏的關鍵是實現技術,而不是設計模式。

3

根據我的經驗,在大多數求職面試中,問題並不尋求過於詳盡的答案,而大多數時間只是棘手的問題,所以如果他們特別要求多態而不擴展類,那麼我會說:

是的,你可以通過實現一個接口,而不是擴展一個類

那麼他們是否會要求更多的選擇那麼這將是確定,彈出代理,圖案或其他什麼東西具有動態多態性。

希望它有幫助!

+2

一個好的面試官會試圖找出1)你知道多少,2)你是否知道如何選擇合適的解決方案,以及3)你是否可以良好地溝通。所以是的,回答這個問題的正確方法是提供簡單的解決方案,*提示*還有其他解決方案和相關的設計模式。一個「長而富有」的答案,如果要求/預期的答案很簡短,則表示溝通技巧差(IMO)。 –

+0

但是我應該補充一點,我把這個問題看作是要求技術信息,而不是在面試環境中說些什麼。 –

+2

'A'長而充實「的答案,要求/預期的簡短答案顯示溝通技巧差(IMO)。或缺乏知識,是嗎?而這一差異很重要(海事組織)。可能會出現這樣的情況,公司增加某人的溝通技巧要花費更多的錢,而不是教他們一些Java設計模式。 –