2009-07-29 33 views
1

我想從我的舊測試類的幾個方法中使用我正在構建的新類。不幸的是,C#不支持多重繼承。我如何重用這些舊類的代碼?我只是將它們創建爲成員對象?或者我有其他選擇嗎?如何在多重繼承不是選項時重用代碼?

+11

** FORTUNATELY ** C#不支持多重繼承! – 2009-07-29 21:00:03

+3

無論是否支持MI,您都不應該在* any *語言中使用繼承進行代碼重用。 – jalf 2009-07-29 21:18:46

+0

@jalf:爲什麼不呢?繼承是一個強大的功能。 我有爭議的觀點是:如果C#DID支持多繼承,會不會很好? – 2009-07-29 22:09:41

回答

11

一般情況下,使用組合而不是繼承是前進的方向,是的。如果你可以給出一個具體的例子,那麼你可以更容易地找到合適的方法:它並不總是一樣的。

-1

,如果你開發了他們作爲一個組件,利用它們從他們

4

inherite不將它們作爲成員對象應該是個不錯的主意。然後,您還可以只顯示感興趣的方法,並在必要時對其進行調整。

4

然後,當他們在相同類型上工作時,您可以重新創建擴展方法。

public static void MyMethod(this MyType target){} 


MyType.MyMethod() 

說明如下,如果有一個從MyType的起源或更常見的實現擴展方法適用於接口的類,擴展適用於那些。

public class MyDerived : MyType{} 

MyDerived.MyMethod() 
0

您可以僞造它很容易像這樣:

public interface IFoo { 
    void DoFoo(); 
} 

public class Foo : IFoo { 
    public void DoFoo() { Console.Write("Foo"); } 
} 

public class Bar { 
    public void DoBar() { Console.Write("Bar"); } 
} 

public class FooBar : IFoo, Bar { 
    private IFoo baseFoo = new Foo(); 
    public void DoFoo() { baseFoo.DoFoo(); } 
} 

//... 

FooBar fooBar = new FooBar(); 

fooBar.DoFoo(); 
fooBar.DoBar(); 
2

從技術上講,C#實現多個接口繼承,但不能多 實施的傳承。

多個實現繼承的問題是,它導致 像the diamond problem的情況。

您可以使用多個接口 繼承和組合來模擬多重實現繼承,這與您所描述的創建 要接近的對象「作爲成員對象」相近。你不想 做,但是從你的包裝類型暴露不必要的行爲。

以下是示出多個的基本原理的類圖 傳承通過組合物:

Multiple Inheritance http://www.freeimagehosting.net/uploads/cb219cefba.jpg

這樣做的缺點是,任何變化IBreeper將需要 到Breeper相應變化的界面處,和反之亦然。

雖然退一步 - 你需要仔細看看構成舊類的 的原因。它是:

  1. 增強或增加現有行爲。您應該考慮Proxy Pattern;

  2. 爲您的所有行爲創建「一站式商店」。如果你的SuperFuddler粘性(也就是說,所有暴露的行爲是對齊的),你應該只是這樣做,否則你會進入一個不利於維護的情況;

  3. 提供的接口與您的SuperFuddler的某一類客戶端所要求的使用模式更加一致。在這種情況下,您應該考慮Adapter Pattern