[英]Clarification regarding the object design
我懷疑何時在OO設計中易於使用接口以及何時使用繼承。 可以說我有一個人類階級,它是從哺乳動物階級繼承而來的。 哺乳動物類將具有實例變量,例如眼睛,鼻子,耳朵和四肢。 我的問題是eat方法應該在Mammal類中還是應該在Interface中。 我認為飲食,睡眠和呼吸方法應該放在接口內部。 請讓我知道我的面向對象設計是否正確,如果我的理解不正確,請告訴我。
我的問題是eat方法應該在Mammal類中還是應該在Interface中。
為什么不能同時在接口和基類中使用它?
(請注意,我不是100%的Java專家,也不知道如何在代碼中實現。這是關於面向對象設計的語言不可知的答案。)
接口和基類是不可互換的,因為您的問題的措辭似乎幾乎暗示了這一點。 它們有兩個截然不同的目的。
接口是一種功能契約。 這是一組可由對象實現的操作。 另一方面,基類是該對象的具體類型。 用模糊的偽類想起來...
界面告訴您可以做什么。 基本類型告訴您什么是什么。
考慮你的例子……哺乳動物和人類。 現在,很明顯,哺乳動物必須是抽象類型。 世界上不可能有通用的“哺乳動物”在敲門,它必須是某種物種。 並考慮到所有哺乳動物都以某種方式進食。
所有哺乳動物都以完全相同的方式進食嗎? 如果是這樣,則可以在抽象基類上創建eat()
的單個實現,並且所有繼承類型都將使用它。
大多數哺乳動物是否以完全相同的方式進食,但是有一些例外嗎? 如果是這樣,那么您仍然可以創建eat()
基本實現,但是允許繼承類型在自己的實現中覆蓋它們(如果他們選擇這樣做)。
大多數或所有哺乳動物以完全不同的方式進食 ,但全部以某種方式進食嗎? 如果是這樣,那么您可能想在基類中創建一個抽象的eat()
方法簽名,並要求繼承類型實現它。
好的,接口從何而來?
好吧,哺乳動物不是唯一可以吃的東西。 鳥吃。 蜥蜴吃。 植物吃。 機器人吃飯。 火吃。 等等
吃很多東西。 不只是哺乳動物及其后代類型。 不僅是他們的祖先類型。 甚至不僅僅是與哺乳動物有任何遠程聯系的類型。 (例如,火災。)因此,“進食”的概念與哺乳動物繼承中的類型層次正交。
為了將通過繼承模型不相關(或至少不能保證是不相關)的這些實現組合在一起,您需要定義一個接口。
假設您有一個僅想饋送對象的操作。 盡管系統的其他部分可能會在乎該對象是哺乳動物還是任何種類的動物,甚至只是任何種類的生物……此操作都不會。 它只是在乎物體可以以某種方式進食。 機器人,火或其他非生命物體可以滿足此要求。 這個行動將宣告它期待一個Eater
,而不是Mammal
。
因此,在基本類型(生物,動物,哺乳動物等)的抽象層次結構中的某個位置,這些類型之一(在此示例中可能是頂級類型)聲明實現了Eater
接口。 這將強制所有繼承類型也必須實現該接口。
如果存在由后代類型繼承的抽象的更高級別的實現,則滿足該接口。 如果沒有,則后代類型將需要提供eat()
的實現來滿足該接口。
但是重點是,完全不在此特定繼承圖之外的其他事物也可以實現該接口,也可以吃東西。
你是對的。 您可以創建一個類似於Animal
的接口,其中將包含這些方法。 在子類(實現Animal
)中,應實現這些方法。 因為例如Mammal
, Reptile
具有不同的行走技術
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.