2017-08-31 23 views
2

我有一種關於繼承的情況,我發現很難找到一個很好的面向對象設計。使用接口/繼承時出現重複代碼

基本上我有以下情況:

Structure

Webservice的是適用於所有WebServices的所有通用功能的抽象類。 然後,大多數網絡服務被分爲促銷網絡服務(檢索促銷數據)或能夠檢索有關人員的信息(PersonWebservice)。這些也是抽象的,因爲它們擁有對所有孩子都是真實的通用實現(在獲得數據後認爲額外的處理)。孩子只持有特定於該子Web服務的功能和實現。

到目前爲止這麼好......但是......我有一個Web服務(Web服務E),這與整個設計混淆...因爲這個Web服務既是一個人的web服務,也是一個促銷web服務......只要我可以看到,在Webservice和Promo/Person webservices之間放置一個超類沒有真正的選擇。事實上,大多數Web服務都具有有限的功能,而Webservice E可以同時執行這兩種功能。

我曾考慮過使用接口,但接下來我將不得不在孩子中多次實現所有通用代碼,或者我必須擴展其中一個超類並複製另一個分支的通用代碼的一半,聽起來不像是一個不錯的設計給我...

有沒有人有什麼好的辦法可以解決這樣的設計/結構問題的任何提示或建議,同時避免儘可能多的重複代碼可能嗎?

非常感謝提前!

+0

你是什麼意思「他們之間的超類」?你可以把一個'上面'他們 – Stultuske

+0

是的抱歉,這就是我的意思。如在WebService - >超類新 - > Promo/PersonWebservice中。但是,我發現難以看到Promo和Person webservice之間的任何「共享」屬性。他們更有能力做到其中一個或兩個。 –

+0

這確實指向了一種代碼異味,https://en.wikipedia.org/wiki/Single_responsibility_principle,爲什麼Webservice E有多重責任,是否沒有辦法將它們分開? –

回答

3

,想到的典型的事情:FCoI - 在繼承青睞組成。

您可以:

  • 創建接口,圍繞「核心功能」
  • 包裹有那些已經存在的類實現它們相應
  • 和WebServiceImpl也實現了接口 - 通過委託到一個實例那些其他類的
0

至於我可以看到有沒有真正把互聯網服務和促銷/人之間的Web服務超類的選項。事實上,大多數Web服務都具有有限的功能,而Webservice E可以同時執行這兩種功能。

爲什麼會是這樣?你可以把你WebService E爲實現WebService一類,則有Promotional WebservicePerson Webservice了擴展,覆蓋必須是abstrat爲抽象的方法。

抽象方法的一個簡單的例子:

public abstract class Animal { 

    @Override 
    public abstract String toString(); 
}