2011-12-19 148 views
1

有一個設計原則,說贊成組合遺傳和其廣告的好處是,它簡化設計。讓我們商定這個問題的背景。可以覆蓋是否被棄用?

那麼,可以重寫被棄用? 可以我們理論上擺脫它好嗎?

讓我們對上面提到的設計原則充滿熱忱,並將它帶到極致:一路構圖。現在應該有足夠的原因,覆蓋濫用

有一個問題出現了:我們程序員是否會放鬆一些東西?試圖阻止一些可能的濫用行爲是否失去了力量?

那麼,有什麼應用程序覆蓋,否則他們可以實現?他們應該嗎?

+0

如果沒有別的,向後兼容性:如果我們_had it_,那麼人們會對它有所要求。 – 2011-12-19 13:22:34

+0

@Mr。失望:讓我們說兼容性不是問題 – Belun 2011-12-19 13:23:32

+2

所以,一切都應該'密封'?而且,「熊」應該有一個子元素「動物」作爲複合物,而「熊」也是「動物」?這是一個非常大的參數_for_繼承,並且隨後重寫 - 「Animal.Eat」方法不應該消耗相同數量的食物。 – 2011-12-19 13:25:53

回答

3

如果完全刪除繼承,則刪除OOP設計的重要功能。
使用繼承允許您使用「」設計,這在OOP設計中具有很強的意義,當然也可以節省代碼冗餘。

如果你只使用封裝你必須要麼暴露成員(這並不總是你想要的(提高,因爲程序員需要知道)的東西量的設計複雜度。
或者使用包裝器方法來調用成員的方法(這是多餘的)

除此之外,讓我們假設你知道overriding and hiding之間的區別,你可以看到大多數OOP語言會在給出選擇時選擇嚴格覆蓋。
這是因爲重寫通常比隱藏更直觀。

所以,如果你刪除覆蓋,並且仍然允許繼承,你將被隱藏。這通常會導致許多運行時錯誤和類型衝突的不期望的結果。

再遠一點,你將無法獲得像指向很多不同派生類的基類指針數組或列表的東西。因爲如果你沒有覆蓋它將無法調用指定的派生類方法,它將只爲它們調用相同的基類方法。

0

我添加astander從his link提取代表響應(希望你不介意)

例如,一個優點與繼承的是,它比成分更容易 使用。但是,易於使用的代價是 難以重用,因爲子類與父類 類相關聯。

構圖的一個優點是它更加靈活,因爲 行爲可以在運行時交換。組成的一個缺點是 ,系統的行爲可能很難通過 查看源代碼來理解。這些都是應用合成而不是繼承時應考慮的因素之一 。

4

這不僅是一個完全激進和不切實際的建議,它不是一個特別引人注目的建議。僅僅因爲某個功能被濫用並不意味着它應該被完全刪除。人們長期以來一直在濫用各種各樣的東西,但這並不意味着如果使用得當,它們不會起到有用的作用。

設計模式是一回事;設計一種有意限制的語言來符合你理想的設計模式的理想是另一回事。在我看來,這是徒勞的練習。程序員仍然會發現有些東西要濫用。

我同意使用override不合適或濫用的主要假設。有很多情況下,你想利用繼承暗示is-a的關係。當然,這個模型在100%的時間內並不適合現實世界,但是它有很多次。

AnimalShape您在教科書中閱讀過的類示例可能有點做作,但我經常在實際應用程序中使用繼承。

這並不意味着我不同意人們應該普遍或有疑問的情緒,而是傾向於構成而不是繼承。但這是而不是說繼承是壞的,不應該使用。

+0

我同意'只是因爲某個功能被濫用並不意味着它應該被徹底刪除'。但我仍想探索這個可行的想法。只是因爲,想一想,這是面向對象的特性。有人把它放在那裏。他/她沒有做什麼? – Belun 2011-12-19 13:51:39

+0

所有的答案似乎指向'易用性和可讀性',到目前爲止,作爲替代參數... – Belun 2011-12-19 14:10:29

+0

@Belun:這就是它*所有*的下降。高級設計模式不允許您的代碼執行任何其他圖靈語言無法完成的任何操作。它們都是程序員的工具。但是這沒什麼可以打噴嚏! – 2011-12-19 14:16:36

0

我總是使用多態。我似乎總是有一堆物體背後有一些共同的概念,並且有很多代碼對這個概念感興趣 - 也就是說,他們關心動物,而不是獅子,老虎和熊,甚至食肉動物。接口通常比超類更好地工作,所以我想我可以不經過子類化。 (當子類不是時,接口是否正常?)但是,我經常發現很多使用接口的類對於接口方法都有相同的代碼。將界面改爲超類可以讓我擺脫很多重複的代碼。我發現自己處於的另一種情況是,除了一件小小的小東西外,一個龐大而複雜的課程能夠滿足我的需求。通過子類化,我可以創建一個新的類,只需幾行即可完成我所需要的功能。

這個辯論可能有一個語言組件。當我用Java寫作時,我的分類速度很快。當我用C#編寫程序時,在重寫任何內容或者甚至使用接口之前,我都會認真考慮。我不確定爲什麼,它可能與我在這些語言中做的工作類型有關,而不是語言本身。但在C#中工作時,我非常同情這個想法,而在Java中工作時......如果我無法重寫,那麼我必須拋棄幾乎所有的Java代碼。

+0

對於這樣一種情況,「一個大的,複雜的類做了我所需要的,除了一個小小的小東西」使用依賴注入。所應用的設計原則是「將不同的東西分開,將不同的東西提取出來,並注入不同的東西」。這樣你可以在需要時注入另一個小東西,而不是子類。 – Belun 2011-12-19 15:47:21

+0

對於依賴注入,您必須修改原始類,如果它來自Microsoft或Sun庫,或者現在很多不希望您混淆的類使用該類,則可能很難做到這一點。隨着時間的推移,您可能需要進行其他更改,將問題擴大。再次,我認爲有一個語言組件。在Java中,我總是可以覆蓋,這很容易,很簡單,代碼看起來不錯,而且我寫的代碼之外沒有任何東西會受到影響。在C#中沒有那麼多;我將會更快地使用依賴注入。 – RalphChapin 2011-12-19 19:51:37