2017-08-01 45 views
0

我曾經要求設計類/接口層次結構來實現用最少的代碼冗餘等級設計層次用最少的代碼編寫

比方說,與有3類,其中每個2共享相同的代碼對於一些方法(即是A類和B類都有方法AB(),B類和C類都有methodBC()等)

有了這樣的背景,我被問到是否最好創建一個抽象類,每個類(A,B,C )擴展或實現接口,或者可能解決它不同?

假設這個問題可以擴展到4個類別(每個類別中有3個具有相同的方法)等等。什麼是最好的解決方案?有沒有一種方法每個方法的代碼只會被寫入一次?

回答

1

如果您要使用抽象類,您有問題(從您的示例中)B必須與A類和B類共享方法。因此,如果您有A類和B類擴展的AB類,那麼您不能讓B再次延長BC級。正如你所說,你可以使用Interfaces來實現,但是你只會共享方法原型而不是實現。例如,C++就是一種允許多重繼承的語言,它引發了其他需要注意的問題(鑽石問題等)。此外,在Java 8中,您將在接口中獲得default methods(實現)。

在你的問題,我認爲我們正在尋找delegation pattern。確保通過其他設計模式 - 策略也有點類似。

+0

是的,設計模式,這可能是他們對我的期望...我會在那裏開始。謝謝! –

0

在這種情況下,兩個問題需要回答 -

  1. 是A,B,C互相替換?如果是的話,這意味着在每個班級中,有一種方法對於 沒有意義。這種情況很少發生,當我們有 強制幾個類(彼此不相似)從 公共基類繼承(例如,當我們強制leaf和 組合具有相同的基類時的複合模式)。如果由於某種原因需要這種人造「IsA」關係,則我們需要針對A,B,C具有共同的基類,併爲每個類中的一個不可用方法提供空實施(折中)。但我覺得我們需要 有這種人爲關係的理由。
  2. AB,BC和CA對可以互相補充(例如A和B是 可替代一個功能,其中B和C可替換 的另一功能)?如果答案爲是,那麼我們需要 在一個接口中捕獲每種方法,並實現需要的接口爲 。一個虛構的例子可以是A和B是Runnable,B和C是可比較的,C和A是ActionListener。

但是一般來說這樣的症狀需要在對象模型級重新檢查。大概我們可能會發現我們違反單一責任原則或'IsA'關係。將來這些補丁可能會陷入困境。

+0

我沒有特別提出這個問題。問題是這些常用方法在名稱方面是相同的。所以每個類都有methodAB(),但是A和B有相同的實現,當C類有不同的(但仍然命名爲methodAB())等等。所有這些類都應該相互「平行」,這意味着在最簡單的情況下,它們都應該是基類的擴展 - 但問題是我們是否真的需要基類或者我們只需要一個還是......? –