如何重用代码时,多重继承是不是一种选择?(How to reuse code when multip

2019-07-31 02:08发布

我想利用从几个我以前的测试类的几个方法到我,我建立新类。 不幸的是,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相应变化,并且反之亦然的接口的任何改变。

退一步说,虽然 - 你需要仔细看一下原因构成老班。 它是:

  1. 增强或加强现有的行为。 那么你应该考虑的代理模式 ;

  2. 创建一个“一站式”的所有行为。 你真的应该只有这样做,如果你的SuperFuddler凝聚力 (即,所有暴露的行为一致),否则你会被移动到一个神的对象是不利于被维护的情况;

  3. 呈现一个接口,是由某一类你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?