23

可能重复:
C# 中的多重继承

我有两个类 A 类和 B 类。这两个类不能相互继承。我正在创建名为 C 类的新类。现在,我想通过继承来实现 A 类和 B 类中的方法。我知道在 C# 中不可能进行多重继承,但还有其他方法可以做到这一点吗?

4

7 回答 7

52

多重继承在 C# 中是不可能的,但是可以使用接口来模拟它,请参阅C# 的模拟多重继承模式

基本思想是为B您希望访问的类上的成员定义一个接口(称为它IB),然后通过内部存储一个实例来C继承A和实现,例如:IBB

class C : A, IB
{
    private B _b = new B();

    // IB members
    public void SomeMethod()
    {
        _b.SomeMethod();
    }
}

该页面上还解释了其他几种替代模式。

于 2012-06-21T09:07:33.147 回答
18

继承的一个常见替代方法是委托(也称为组合):X“具有”Y 而不是 X“是”Y。因此,如果 A 具有处理 Foos 的功能,而 B 具有处理 Bars 的功能,并且您想要两者都在C中,然后是这样的:

public class A() {
  private FooManager fooManager = new FooManager(); // (or inject, if you have IoC)

  public void handleFoo(Foo foo) {
    fooManager.handleFoo(foo);
  }
}

public class B() {
  private BarManager barManager = new BarManager(); // (or inject, if you have IoC)

  public void handleBar(Bar bar) {
    barManager.handleBar(bar);
  }
}

public class C() {
  private FooManager fooManager = new FooManager(); // (or inject, if you have IoC)
  private BarManager barManager = new BarManager(); // (or inject, if you have IoC)

  ... etc
}
于 2012-06-21T09:08:22.423 回答
12

如果你想从字面上使用方法代码AB你可以让你的C类包含每个的实例。如果您针对接口进行编码AB那么您的客户就不需要知道您给他们的是 aC而不是 anA或 a B

interface IA { void SomeMethodOnA(); }
interface IB { void SomeMethodOnB(); }
class A : IA { void SomeMethodOnA() { /* do something */ } }
class B : IB { void SomeMethodOnB() { /* do something */ } }
class C : IA, IB
{
    private IA a = new A();
    private IB b = new B();
    void SomeMethodOnA() { a.SomeMethodOnA(); }
    void SomeMethodOnB() { b.SomeMethodOnB(); }
}
于 2012-06-21T09:13:35.463 回答
9

使用成分

class ClassC
{
    public ClassA A { get; set; }
    public ClassB B { get; set; }   

    public C (ClassA  a, ClassB  b)
    {
        this.A = a;
        this.B = b;
    }
}

然后就可以调用了C.A.DoA()。您还可以将属性更改为接口或抽象类,例如public InterfaceA Apublic AbstractClassA A

于 2012-06-21T09:09:29.680 回答
6

制作两个接口IAIB

public interface IA
{
    public void methodA(int value);
}

public interface IB
{
    public void methodB(int value);
}

接下来制作A实施IAB实施IB

public class A : IA
{
    public int fooA { get; set; }
    public void methodA(int value) { fooA = value; }
}

public class B : IB
{
    public int fooB { get; set; }
    public void methodB(int value) { fooB = value; }
}

然后按如下方式实现您的 C 类:

public class C : IA, IB
{
    private A _a;
    private B _b;

    public C(A _a, B _b)
    {
        this._a = _a;
        this._b = _b;
    }

    public void methodA(int value) { _a.methodA(value); }
    public void methodB(int value) { _b.methodB(value); }
}

一般来说,这是一个糟糕的设计,因为您可以同时拥有AB实现具有相同名称和变量类型的方法,例如foo(int bar),您将需要决定如何实现它,或者您是否只调用foo(bar)两者_a_b。正如其他地方所建议的那样,您应该考虑 a.A.B属性,而不是结合这两个类。

于 2012-06-21T09:14:41.010 回答
3

您可以为这些基类定义一个基类,A并且B可以在其中保存它们的通用方法/属性/字段。

实施后C:Base

或者为了模拟多重继承,定义一个公共interface(s)并在C

希望这可以帮助。

于 2012-06-21T09:04:21.953 回答
-4

在这种情况下,您的意思是希望 C 类成为 A 和 B 的基类。

public abstract class C
{
    public abstract void Method1();

    public abstract void Method2();
}

public class A : C
{
    public override void Method1()
    {
        throw new NotImplementedException();
    }

    public override void Method2()
    {
        throw new NotImplementedException();
    }
}


public class B : C
{
    public override void Method1()
    {
        throw new NotImplementedException();
    }

    public override void Method2()
    {
        throw new NotImplementedException();
    }
}
于 2012-06-21T09:18:48.457 回答