当多重继承不是一个选项时,如何重用代码?

时间:2009-07-29 20:56:52

标签: c# inheritance oop multiple-inheritance reusability

我想从几个旧的测试类中使用一些方法到我正在构建的新类中。不幸的是,C#不支持多重继承。如何重用这些旧类中的代码?我只是将它们创建为成员对象吗?或者我还有其他选择吗?

6 个答案:

答案 0 :(得分:11)

通常,使用组合而不是继承是前进的方向,是的。如果你能给出一个你所指的那种事物的具体例子,那么就可以更容易地找到合适的方法:它并不总是相同的。

答案 1 :(得分:4)

将它们用作成员对象应该是一个好主意。然后,您也可以只公开感兴趣的方法,并在必要时进行调整。

答案 2 :(得分:4)

当它们处理相同类型时,您可以重新创建扩展方法。

public static void MyMethod( this MyType target ){}


MyType.MyMethod()

如下所述,如果你有一个派生自MyType的类,或者更常见的是实现扩展方法所使用的接口,那么扩展适用于那些。

public class MyDerived : MyType{}

MyDerived.MyMethod()

答案 3 :(得分:2)

从技术上讲,C#实现了多个接口继承,但不是多个 实施继承。

多个实现继承的问题是它导致 像the diamond problem这样的情况。

您可以使用多个接口模拟多个实现继承 遗产和构成,接近你所描述的创造 要重用的对象“作为成员对象”。你不想要什么 然而,要做的是从你的包装类型中暴露出不必要的行为。

以下是显示多重基本原理的类图 通过作文继承:

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

这样做的缺点是对IBreeper接口的任何更改都需要 Breeper的相应变化,反之亦然。

退后一步 - 你需要仔细看看原因 撰写旧班。它是:

  1. 增强或加强现有行为。然后,您应该考虑Proxy Pattern;

  2. 为您的所有行为创建“一站式服务”。如果您的 SuperFuddler 内聚(也就是说,所有公开的行为都已对齐),您应该只是这样做,否则您将进入God Object不利于维持的情况;

  3. 提供一个与SuperFuddler的某类客户端所需的使用模式更一致的界面。在这种情况下,您应该考虑Adapter Pattern

答案 4 :(得分: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();

答案 5 :(得分:-1)

如果您已将它们开发为组件,请使用它们不从它们继承