2009-07-29 55 views
1

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

+11

** FORTUNATELY ** C#不支持多重继承! – 2009-07-29 21:00:03

+3

无论是否支持MI,您都不应该在* any *语言中使用继承进行代码重用。 – jalf 2009-07-29 21:18:46

+0

@jalf:为什么不呢?继承是一个强大的功能。 我有争议的观点是:如果C#DID支持多继承,会不会很好? – 2009-07-29 22:09:41

回答

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相应变化的界面处,和反之亦然。

虽然退一步 - 你需要仔细看看构成旧类的 的原因。它是:

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

  2. 为您的所有行为创建“一站式商店”。如果你的SuperFuddler粘性(也就是说,所有暴露的行为是对齐的),你应该只是这样做,否则你会进入一个不利于维护的情况;

  3. 提供的接口与您的SuperFuddler的某一类客户端所要求的使用模式更加一致。在这种情况下,您应该考虑Adapter Pattern