2011-03-15 64 views
5

哪兩個應該是首選?基本類與效用類

有一些方法,其是由類A,B和C.

稱爲如果這些方法中的一類d(A,B和C的基極)被封裝?

OR

如果這些方法在U類和其他類。外幣它的對象使用的方法根據需要進行封裝。

應該在什麼基礎上作出決定?

謝謝。

+4

類A,B和C之間是否存在任何概念關係? – 2011-03-15 13:14:16

+0

如何通過A,B,C製作界面並實現它? – 2011-03-15 13:17:07

+0

@p:只有它們構造D類使用的數據。A需要與其他類不同的輸入。 @Srinivas:這些方法的實現對於A,B和C來說是完全相同的。 – Azodious 2011-03-15 13:22:48

回答

9

您應該製作一個static實用程序類。

只有使用繼承,如果它實際上是有意義—如果ABC實際上一個D

+0

是的,我想。 D有調用三種類型算法的方法。 A,B和C構造特定於算法的數據並調用這些常用方法來執行。 – Azodious 2011-03-15 13:16:45

+0

@Azo:細節總是有幫助的。在這種情況下,也許你應該使用繼承,用'A','B'和'C'覆蓋'abstract'方法。 – SLaks 2011-03-15 13:17:52

+0

我完全同意你的第二點,但我只會建議使用靜態工具類,其中實用工具方法沒有狀態(即沒有靜態變量),並且不執行任何帶有副作用的操作(文件IO或數據庫活動等) 。如果你是單元測試A,B和C,那麼使用模擬對象將它們與靜態工具類分離(幾乎)是不可能的。使用通過構造器注入傳遞給A/B/C的非靜態工具類會更好。那麼你的代碼是高度可配置的,並通過聚合獲取行爲。 – sheikhjabootie 2011-03-15 13:26:52

2

我會傾向於繼承,除非有明顯的關係is-a的關係。我懷疑從你上面的描述來看,情況並非如此。我的首選解決方案是:

  1. 注入一個實用工具類的一個實例,爲你的A,B,C
  2. 有A,B,C實例化適當的實用工具類

優勢注入類的方法是你可以簡單地提供不同的實現。這對測試特別有用。使用靜態方法的單身人士或班級往往會出於同樣的原因導致問題 - 您無法輕易覆蓋或替換它們。

3

如果他們正在做特定於A,B和C類的事情,那麼他們應該在基類中,我會根據這些方法正在做什麼做出決定。通過隱藏與系統其他部分相關的功能,這有助於保持代碼清潔。 (當然,我假設A,B和C要麼已經從D繼承,要麼顯然是相關的)

如果他們正在做其他類型的事情,那不是固有的A,B和C,那麼爲了最大化再利用的機會,他們應該在實用類中。

如果他們正在處理其他類型的特定於其他類型的事物(例如,漂亮地打印日期時間),請考慮將它們作爲的擴展方法類型。

+1

+1:你打敗了我。正如SLaks提到的那樣,OP似乎也沒有意識到靜態函數。也許值得一提的是,對於公用事業類。 – 2011-03-15 13:18:31

0

使用基類 如果您打算根據基類編寫一些邏輯 - 那麼創建一個基類是有意義的。在這種情況下,您的派生類應該完全替代您的基類。不應該有任何開關邏輯來檢查派生類型並相應地採取行動。見里氏替換原則:http://en.wikipedia.org/wiki/Liskov_substitution_principle

使用的工具類 有些語言,他們不支持多重繼承的限制。如果你已經有了一個有意義的基類,那麼你需要去實用課程。另外,當你使用繼承時,你正在創建從dervied類到基類之間的緊密耦合。

如果派生類自然可以替代它的基類,我會去基類。如果目的只是爲了在類之間共享一些可重用的代碼,那麼使用實用類更合理。