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

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

一般来说,使用组合而不是inheritance是前进的方向,是的。 如果你能给出一个你所指的那种东西的具体例子,那么它将更容易帮助找到合适的方法:它并不总是相同的。

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

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

public static void MyMethod( this MyType target ){} MyType.MyMethod() 

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

 public class MyDerived : MyType{} MyDerived.MyMethod() 

从技术上讲,C#实现了多个接口inheritance,但没有多个实现inheritance。

多个实现inheritance的问题是它会导致钻石问题 。

您可以使用多个接口inheritance和组合来模拟多个实现inheritance,这与您描述的创建要作为成员对象重用的对象的内容非常接近。 但是,您不想做的是从您的包装类型中暴露出不必要的行为。

以下是一个类图,显示了通过组合实现多重inheritance的基本原则:

多重inheritancehttp://sofzh.miximages.com/c%23/www.freeimagehosting.net

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

退一步 – 你需要仔细查看编写旧类的原因。 它是:

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

  2. 为您的所有行为创建“一站式服务”。 如果你的SuperFuddler具有凝聚力 (即所有暴露的行为都是对齐的),你应该真的只做这个,否则你将进入一个不利于维护的God Object情境;

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

你可以很容易地伪装它:

 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(); 

如果您已将它们作为组件开发,请使用它们不要从它们inheritance