2

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

4

5 回答 5

11

一般来说,使用组合而不是继承是前进的方向,是的。如果你能给出一个具体的例子来说明你的意思,那将更容易帮助找到合适的方法:它并不总是一样的。

于 2009-07-29T20:59:19.273 回答
4

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

于 2009-07-29T20:59:42.407 回答
4

当它们在同一类型上工作时,您可以重新创建它们作为扩展方法。

public static void MyMethod( this MyType target ){}


MyType.MyMethod()

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

public class MyDerived : MyType{}

MyDerived.MyMethod()
于 2009-07-29T21:00:28.007 回答
2

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

多重实现继承的问题在于它会导致类似钻石问题的情况。

您可以使用多个接口继承和组合来模拟多个实现继承,这与您所描述的创建要“作为成员对象”重用的对象非常接近。但是,您不想做的是从您的包装类型中公开不必要的行为。

下面是一个类图,展示了通过组合实现多重继承的基本原理:

多重继承 http://www.freeimagehosting.net/uploads/cb219cefba.jpg

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

但是退后一步 - 您需要仔细查看编写旧课程的原因。是否:

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

  2. 为您的所有行为创建一个“一站式商店”。如果你的SuperFuddler是有凝聚力的(也就是说,所有暴露的行为都是一致的),你真的应该这样做,否则你将进入一个不利于可维护的上帝对象情况;

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

于 2009-07-30T06:51:21.123 回答
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();
于 2009-07-29T21:21:22.043 回答