继承自C#中的两个类

Vir*_*rus 12 .net c#

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

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

谢谢

KF2*_*KF2 38

C#中无法实现多重继承,但可以使用接口进行模拟,请参阅C#的模拟多重继承模式.

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

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

    // IB members
    public void SomeMethod()
    {
        _b.SomeMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

该页面上还有一些其他的替代模式.


Ric*_*ich 10

继承的共同选择是代表团(也称为组成):X"有一个" Y而非X"是一个" Y因此如果有处理FOOS功能,和B具有以下功能:用于处理酒吧,和你想在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
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*ter 7

使用成分

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

    public C (ClassA  a, ClassB  b)
    {
        this.A = a;
        this.B = b;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Raw*_*ing 7

如果你想从字面上使用方法代码A,B你可以让你的C类包含每个的实例.如果您针对接口编码A,B那么您的客户不需要知道您给的是一个C而不是一个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(); }
}
Run Code Online (Sandbox Code Playgroud)


Sep*_*eph 6

创建两个接口IAIB

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

public interface IB
{
    public void methodB(int value);
}
Run Code Online (Sandbox Code Playgroud)

接下来制定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; }
}
Run Code Online (Sandbox Code Playgroud)

然后按如下方式实现您的 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); }
}
Run Code Online (Sandbox Code Playgroud)

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