我在採訪中被問到如何在不擴展類的情況下實現動態多態。如何才能做到這一點?如何實現動態多態而不擴展類
回答
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
在您對OP的評論中,您聲明,沒有繼承的_多態性在Java_中是不可能的,但在這裏您將通過封裝給出一個多態的例子。這個例子是否與前面的陳述相矛盾? – jaco0646
簡單的解決方案是編寫一個實現接口而不是擴展基類的類。
另一種解決方案是創建一個動態代理......這實際上是一種實現接口而不明確寫入類的聰明方式。詳情請參閱Proxy
javadoc。
是的,這些都是(或可以)裝飾模式的例子,雖然這裏的關鍵是實現技術,而不是設計模式。
根據我的經驗,在大多數求職面試中,問題並不尋求過於詳盡的答案,而大多數時間只是棘手的問題,所以如果他們特別要求多態而不擴展類,那麼我會說:
是的,你可以通過實現一個接口,而不是擴展一個類
那麼他們是否會要求更多的選擇那麼這將是確定,彈出代理,圖案或其他什麼東西具有動態多態性。
希望它有幫助!
一個好的面試官會試圖找出1)你知道多少,2)你是否知道如何選擇合適的解決方案,以及3)你是否可以良好地溝通。所以是的,回答這個問題的正確方法是提供簡單的解決方案,*提示*還有其他解決方案和相關的設計模式。一個「長而富有」的答案,如果要求/預期的答案很簡短,則表示溝通技巧差(IMO)。 –
但是我應該補充一點,我把這個問題看作是要求技術信息,而不是在面試環境中說些什麼。 –
'A'長而充實「的答案,要求/預期的簡短答案顯示溝通技巧差(IMO)。或缺乏知識,是嗎?而這一差異很重要(海事組織)。可能會出現這樣的情況,公司增加某人的溝通技巧要花費更多的錢,而不是教他們一些Java設計模式。 –
- 1. 動態類擴展
- 2. 如何動態擴展ES5和ES6類
- 3. 動態擴展一個類
- 4. PHP類擴展動態
- 5. 動態擴展的類
- 6. 聲明一個擴展另一個多態類的多態類
- 7. java中如何擴展類,而實現父類的方法
- 8. PHP動態擴展
- 9. 擴展方法擴展靜態類
- 10. Hibernate多態性(擴展父類)
- 11. C++靜態而不是動態多態
- 12. 如何擴展或實現類?
- 13. 類擴展MX DataGrid如何實現allowMultipleSelection
- 14. 如何在C#中擴展靜態類#
- 15. 如何在動態擴展中推動動態時間間隔
- 16. 如何動態實現ionRangeSliders
- 17. 如何實現動態rowspan
- 18. 如何實現Highcharts動態
- 19. 如何擴展實現接口的枚舉的靜態方法?
- 20. 如何使用Yii Foundation擴展實現錯誤狀態FounActiveForm
- 21. 擴展一個類的CoffeeScript動態
- 22. 在運行時動態擴展類型?
- 23. 擴展類動態的ExtJS的
- 24. PHP:動態得到擴展當前類
- 25. Python和動態擴展C++類
- 26. 如何動態擴展div高度?
- 27. 如何擴展半動態公式?
- 28. 如何動態擴展數據模型?
- 29. 如何動態擴展UITableViewCell高度?
- 30. 如何動態擴展對象?
多態性沒有擴展一個類或多態沒有繼承?無法繼承的 – Santosh
多態性在Java – yegor256
@ yegor256中是不可能的,這就是接口的做法 –