2016-09-16 26 views
1

(我是一個新手開發商還在學習最佳實踐和Java - 任何幫助/方向,將不勝感激,謝謝!)如何在沒有多重繼承的情況下避免代碼重複(即在java中)?

假設我有以下情況:

  • ClassA擴展抽象ClassB這延伸摘要ClassC
  • ClassD延伸摘要ClassE其中延伸摘要ClassF 其中延伸摘要ClassC

[ClassC是父類]

其中ClassAClassD有一組相同的屬性,吸氣劑,&制定者。

我想避免代碼重複(屬性,getters,setters)。我也想避免寫出不同的方法doSomething(ClassA class, ...)doSomething(ClassD class, ...),這些方法除了參數類型外都是相同的。

如果這兩個類直接從ClassC繼承,我會讓它們擴展一個擁有所有getter和setter和屬性的類,並將該類型傳入方法doSomething(..)。由於ClassAClassD不能擴展多個類,因此處理這種情況的最佳方法是什麼?

+0

那麼在Java中,你可以使用* interfaces *。 –

+3

你有沒有具體的例子說明你爲什麼會讓互通圖變得如此之深? –

+1

所以D是一個E是一個F是一個C.這是有點太多的繼承使用。 –

回答

1

首先,常用的方法,讓我說,這是很好的時候(由自己承認)新手開發者關心這類問題。這是一個難以解決的棘手問題。

一種方法是讓你的類實現接口而不是擴展其他類。在java中,一個類不能擴展多個類,但它可以實現多個接口。不幸的是,這並不能節省你很多工作,因爲當一個類實現一個接口時,你仍然必須編寫所有的實現代碼。

另一種方法是避免繼承,並使用組合。這意味着你將有一個類ClassAD其中將包括ClassAClassD之間通用的功能,那麼您將ClassA包含ClassAD一個實例,然後你會作出ClassD還包含ClassAD一個實例,然後你將有一個ClassAD getAD()方法中的某個位置,以便ClassAClassD都有。

因此,如果ClassAD包含方法foo(),您可以使用instanceOfA.getAD().foo()instanceOfD.getAD().foo()

0

我不確定是否正確理解了您的問題,但我會試一試。而不是多個抽象類,創建多個接口。然後創建一個實現兩個接口的類。 Java允許實現多個接口,但不能從多個類擴展。

0

在我看來,這可能是有一個ClassAD有用,擴展ClassC幷包含ClassAClassD.

常見的方法的另一個選擇是創建一個接口InterfaceAD並有ClassAClassD實現它。使用接口作爲參數的功能,如doSomething(InterfaceAD i)

0

你可以像

class M 

    class A extends B 

     inherit B's stuff 

    class D extends E 

     inherit E's stuff 

    A b = new A(); 
    D d = new D(); 
    // or use anonymous classes 

    M has access to everything in A and D, 
    therefore M has access to A and D inheritable assets. 

現在添加您在C級

0

你應該真的在這裏討論抽象類。你打算怎麼樣test A,B和C,D,E和F?
這將包括由C語言實現的(因爲它也被用於所有其他類)的任何方法有很多重複的測試用例的等

正如人們所說的,確實討論過遺傳組成。 A可能有一個C,並通過方法。它也可能有一個Q,因此將D.
d和A可以再實現相同的接口(也可能由Q來實現,儘管這可能會使其混亂)

要知道,我不是抽象類的粉絲,並且傾向於使用組合和/或策略來代替。