继承自C#中的两个类

时间:2012-06-21 09:02:36

标签: c# .net

  

可能重复:
  Multiple Inheritance in C#

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

由于

7 个答案:

答案 0 :(得分:34)

在C#中无法实现多层继承,但可以使用接口进行模拟,请参阅Simulated Multiple Inheritance Pattern for C#

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

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

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

该页面上还有其他几种替代模式。

答案 1 :(得分:9)

继承的常见替代方法是委托(也称为组合):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
}

答案 2 :(得分:7)

如果您希望逐字地使用AB中的方法代码,则可以使C类包含每个类的实例。如果您针对AB的界面进行编码,那么您的客户无需知道您给他们C而不是A或{{1 }}

B

答案 3 :(得分:4)

使用composition

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

答案 4 :(得分:3)

您可以为AB定义基类,您可以在其中保存常用方法/属性/字段。

实施C:Base之后。

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

中实现它们

希望这有帮助。

答案 5 :(得分:3)

制作两个接口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.B属性,而不是将这两个类合并。

答案 6 :(得分:0)

你的意思是你希望C级成为A& 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();
    }
}