2012-05-23 11 views
2

相同的實現說我有以下情形:在不同的子類

abstract class A { 
     abstract method1(); 
     abstract method2(); 
    } 

    class B extends A { 
     method1() { 
      // implementation 1 
     } 
     method2() { 
      // implementation 3 
     } 
    } 

    class C extends A { 
     method1() { 
      // implementation 1 
     } 
     method2() { 
      // implementation 4 
     } 
    } 

    class D extends A { 
     method1() { 
      // implementation 2 
     } 
     method2() { 
      // implementation 4 
     } 
    } 

底線:同一類的幾個子類,採用不同的方法實現了不同的方法。

問題是我在不同的子類中有相同的實現。我的問題是如何處理這些常見的實現?
這樣做的邏輯方法是創建另一個抽象層次,但只有當我有一個具有通用實現的方法(因爲Java沒有多重繼承)時纔有效。我也可以把最常用的實現放在超類中,並且只在其他類中實現。然而,我不會這樣做,因爲最常見的實現可能會隨着其他類的添加而改變,此外,我想將抽象方法保留在超類中。

是否有某種模式能以「優雅的方式」解決我的問題?

+1

有沒有模式可以放在一堆無關的方法。模式將取決於這些方法如何相互關聯(模式的上下文部分) –

+0

如果方法不相關,但您仍然想從一個類繼續引用它們,請使用:「單一類,無繼承和命令模式(每個方法一個命令對象)',則可以通過構造函數 –

+0

注入命令對象。它們不是無關的。它們爲客戶端提供了一些必需的功能,但只是以不同的方式做。 – Deelazee

回答

5

您正在運行與繼承heirarchies經典的OOP問題變得笨拙:-)

我建議的解決方案:

  • 體型組成繼承 - 因子出實現爲單獨的對象可以「插入」以提供所需的行爲。基類中的方法只是通過定義的接口調用實現插件。這基本上是Strategy Pattern。這是一種非常可靠的方法,雖然有時會在你有很多不同的策略類型時容易出現大量過度工程/樣板。
  • 採用基於原型的模型 - 使用prototype-based對象而不是傳統的OOP。這解決了所有問題 - 您可以避免繼承層次結構的內在限制,只需將運行時所需的實現複製到任何對象即可。這是最激進的選擇,但可以帶來一些很大的好處。
  • 將因素實現納入靜態函數 - 通過這種方式可以共享實現 - 這有點麻煩,因爲您仍然需要執行所有覆蓋操作,但它們只是成爲一線用戶,將呼叫委託給正確的實現。這通常是最不干擾的選擇。
+0

感謝您的分析。主要由於提及戰略而被接受。 – Deelazee

2

我會推薦Composition。考慮以下內容:

interface I1 { 
    method1(); 
} 

abstract class A implements I1{ 
    abstract method1(); 
    abstract method2(); 
} 

class CommonOperations implements I1 { 
    method1() { 
     // implementation 1 
    } 
} 

class B extends A { 
    CommonOperations common; 

    method1() { 
     common.method1(); 
    } 
    method2() { 
     // implementation 3 
    } 
} 

class C extends A { 
    CommonOperations common; 

    method1() { 
     common.method1(); 
    } 
    method2() { 
     // implementation 4 
    } 
} 

class D extends A { 
    method1() { 
     // implementation 2 
    } 
    method2() { 
     // implementation 4 
    } 
}