我想从我的旧测试类的几个方法中使用我正在构建的新类。不幸的是,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. 多重继承
- 4. 多重继承
- 5. 多重继承()
- 6. 多重继承
- 7. python类继承代码重用
- 8. 如何防止C#中的代码重复多个继承
- 9. 扩展类没有多重继承或重复的代码
- 10. 如何模拟多重继承在C#
- 11. C++多重继承
- 12. 多重继承:2Classes1Method
- 13. EF代码首次多重继承是排他性的?
- 14. 用重写模仿多重继承
- 15. 是否有某种方式不重复的代码继承类
- 16. 如何设计缺乏多重继承?
- 17. 如何伪造多重继承?
- 18. 如何处理这种多重继承?
- 19. 如何给JsDoc多重继承或mixins?
- 20. 例子如何做多重继承?
- 21. 使用QThread和QWidget进行多重继承(使用QObject进行多重继承)
- 22. 虚拟继承如何解决“菱形”(多重继承)歧义?
- 23. 使用接口/继承时出现重复代码
- 24. 使用Javascript - 在ES6多重继承,
- 25. QScopedPointer是否隐藏多重继承
- 26. Rails布局,多重还是继承?
- 27. 多重继承 - 是否有出路?
- 28. cocos2d-x是否强制多重继承?
- 29. 如何模拟多重继承并使用反射来优化此代码?
- 30. Python的多重继承
** 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