我想從我的舊測試類的幾個方法中使用我正在構建的新類。不幸的是,C#不支持多重繼承。我如何重用這些舊類的代碼?我只是將它們創建爲成員對象?或者我有其他選擇嗎?如何在多重繼承不是選項時重用代碼?
1
A
回答
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相應變化的界面處,和反之亦然。
雖然退一步 - 你需要仔細看看構成舊類的 的原因。它是:
增強或增加現有行爲。您應該考慮Proxy Pattern;
爲您的所有行爲創建「一站式商店」。如果你的SuperFuddler是粘性(也就是說,所有暴露的行爲是對齊的),你應該只是這樣做,否則你會進入一個不利於維護的情況;
提供的接口與您的SuperFuddler的某一類客戶端所要求的使用模式更加一致。在這種情況下,您應該考慮Adapter Pattern。
相關問題
- 1. 如何在繼承不是選項時實現重複行爲
- 2. 避免代碼重複而不使用多重繼承
- 3. Java多繼承,擺脫重複代碼
- 4. 沒有多重繼承且沒有代碼複製的多重繼承
- 5. Java:替代多重繼承
- 6. 接口(作爲多重繼承的替代品)如何實現代碼重用
- 7. 如何重用沒有多繼承的代碼?
- 8. 多重繼承
- 9. 多重繼承
- 10. 多重繼承()
- 11. 多重繼承
- 12. 多重繼承
- 13. 多重繼承
- 14. 多重繼承
- 15. 繼承僅用於代碼重用C++
- 16. 繼承代碼的可重用
- 17. XAML繼承,代碼重用,優化
- 18. python類繼承代碼重用
- 19. 如何防止C#中的代碼重複多個繼承
- 20. 擴展類沒有多重繼承或重複的代碼
- 21. 如何模擬多重繼承在C#
- 22. 如何在javascript中多重繼承
- 23. 多重繼承C#
- 24. C++多重繼承
- 25. C++多重繼承
- 26. 多重繼承:2Classes1Method
- 27. 多重繼承使用C#
- 28. 多重繼承在C++
- 29. 用重寫模仿多重繼承
- 30. nodejs,玉多重繼承不起作用?
** FORTUNATELY ** C#不支持多重繼承! – 2009-07-29 21:00:03
無論是否支持MI,您都不應該在* any *語言中使用繼承進行代碼重用。 – jalf 2009-07-29 21:18:46
@jalf:爲什麼不呢?繼承是一個強大的功能。 我有爭議的觀點是:如果C#DID支持多繼承,會不會很好? – 2009-07-29 22:09:41