我想利用从几个我以前的测试类的几个方法到我,我建立新类。 不幸的是,C#不支持多重继承。 如何从这些老班重用代码? 难道我只是创建它们的成员对象? 或者我有什么其他选择?
Answer 1:
通常,使用组成,而不是继承的是前进的方向,是的。 如果你能给那种你的意思是事情的一个具体的例子,这将使它更容易帮助找到合适的方法,虽然:它并不总是相同的。
Answer 2:
用它们作为成员对象应该是个不错的主意。 那么你也可以只露出感兴趣的方法,并在必要时调整它们。
Answer 3:
当他们在同类型的工作,你可以重新创建的扩展方法。
public static void MyMethod( this MyType target ){}
MyType.MyMethod()
说明如下,如果有一个从MyType的起源或更常见的实现扩展方法适用于接口的类,扩展适用于那些。
public class MyDerived : MyType{}
MyDerived.MyMethod()
Answer 4:
从技术上讲,C#实现多个接口继承,而不是多种实现的传承。
与多个实施的传承的问题是,它会导致类似情况的钻石问题 。
您可以使用多个接口的传承与组成,这是接近你所描述的,创建要重新使用“的成员对象”的对象模拟多个实施的传承。 你不想做什么,但是从你的包裹型暴露不必要的行为。
以下是示出通过组合物的多个传承的基本原理的类图:
多重继承http://www.freeimagehosting.net/uploads/cb219cefba.jpg
这样做的缺点是,对IBreeper将需要Breeper相应变化,并且反之亦然的接口的任何改变。
退一步说,虽然 - 你需要仔细看一下原因构成老班。 它是:
增强或加强现有的行为。 那么你应该考虑的代理模式 ;
创建一个“一站式”的所有行为。 你真的应该只有这样做,如果你的SuperFuddler是凝聚力 (即,所有暴露的行为一致),否则你会被移动到一个神的对象是不利于被维护的情况;
呈现一个接口,是由某一类你SuperFuddler的客户需要使用的模式更加一致。 在这种情况下,你应该考虑适配器模式 。
Answer 5:
您可以伪造它很容易这样的:
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();
Answer 6:
如果你已经开发出他们作为一个组件,利用它们从他们inherite不
文章来源: How to reuse code when multiple inheritance is not an option?