如何在C#中模拟多重继承?

D J*_*D J 1 .net c# inheritance

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

我知道C#不支持类中的多重继承.

不过,我需要做补充的功能 ClassA和ClassB的MyClass中:

public class ClassA
{
    /* Third party class*/
}
public class ClassB
{
    /* Third party class*/
}

public class MyClass : ClassA, ClassB
{
    /*Compilation error*/
}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以实现吗?

Dam*_*ver 9

在C#中只能有多个接口继承.使用这些第三方类可以做的最好的事情是封装每个第三方类的实例MyClass并重新创建每个函数调用并将其传递给适当的实例.

public class MyClass
{
    ClassA a = new ClassA();
    ClassB b = new ClassB();

    void AMethod()
    {
       a.AMethod();
    }

    int BMethod(int value)
    {
      return b.BMethod(value);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要能够在需要的位置使用此类ClassA,则可以添加转换运算符以将其转换回ClassAClassB.是否更适合返回这些新实例或暴露内部实例是您需要仔细考虑的.

显然,如果ClassA还是ClassB 实现任何接口,我建议你实现这些在你的新类也.

但是,在一天结束时,C#没有多个实现继承.如果你需要这样的(这是罕见的),那么C#就不是一种合适的语言.也没有任何其他CLR语言,因为这是CLR限制,而不是特别是C#语言.


Bas*_*Bas 7

如果您无法更改ClassA,ClassB我建议为这些类创建子类型,然后进行聚合.

//third party
class ClassA
{
    void X();
}
class ClassB
{
    void Y();
}
//your code
interface IClassA
{
    void X();
}
interface IClassB
{
    void Y();
}

class MyClassA : ClassA, IClassA { }
class MyClassB : ClassB, IClassB { }

class MyClass : IClassA, IClassB
{
    IClassA a = new MyClassA();
    IClassB b = new MyClassB();
    public void X()
    {
        a.X();
    }

    public void Y()
    {
        b.Y();
    }
}
Run Code Online (Sandbox Code Playgroud)