實現同一介面的不同類使用組合實現了多態,但是這破壞了DRY嗎?

前提:單根繼承OO語言如 java7, objc 等,且不具備 mix-in 等高級方案。

例如,一個介面叫削水果

兩個類叫 菜刀 和 日本刀,都實現削水果介面

兩個類的削水果實現都是削皮

削皮的實現是完全一樣的,代碼copy-paste,這違反了DRY原則。

怎麼解決這個問題呢?


所以最終就會有

水果(蘋果,西瓜)

刀(菜刀,日本刀)

和削(削人棍,扒皮)

三類組件,而不是你想的兩類。

合起來就是

武道館 fuck = 削人棍武道館.Instance;
刀法 shit= fuck.培訓();
shit.使用(new 西瓜, new 菜刀);


你以為菜刀和日本刀削皮的方法一樣嗎?


方案一

考慮定義一個叫「刀」的父類,實現削水果那個介面,實現那個方法。這倆刀從刀那邊繼承。

方案二

定義一個名叫刀的介面,倆刀實現刀介面,不實現削水果介面。

定義一個「削水果機」類,包含一個刀介面的對象,實現削水果介面,實現裡面,調用刀介面提供的方法,實現削水果功能。


介面一般是具有某種功能(動態特徵)的載體,而介面的實現對象在類別上一般不屬於同類。比如,

彈簧和你褲襠里的東西 可以抽象為一個具有可伸縮功能的介面。

如 java中 把具有可關閉功能的對象(輸入、輸出流,資料庫連接等)抽象為java.io.Closeable 介面 ;把可用於線程執行的任務抽象成 java.lang.Runnable 介面。

對於菜刀和西瓜刀,它們屬於相同的屬類,除了具有共性的動態特徵(方法 :切東西),還具有

共性的靜態特徵(屬性:製作的材料等)在代碼中一般用抽象類表達。


你這 「削水果" 顯然不是介面。

介面表示的往往是一個謂語。

典型的介面比如:

start stop modify create add update modify

你這個一定是 削 介面

然後調用的時候傳入的是水果這個類。

這是一。

然後,菜刀和武士刀,都是刀啊,你需要一個父類。

實現的時候,削由父類實現。

。。。

這是二。

所以你的建模是錯的。

最後。

輪子哥說的對。

聽他的。


應該可以用策略模式吧,將削皮方法的實現封裝為函數對象


輪子哥說的的確到位


為什麼不用一個抽象介面 刀 來設計呢


推薦閱讀:

設計模式在實際開發中用的多嗎?
設計模式之組合模式
設計模式之工廠模式
PyQt信號槽的Python實現
Design Pattern 劃分方式是對設計的邏輯思考

TAG:面向對象編程 | 設計模式 |