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

时间:2013-01-11 08:32:51

标签: c# .net inheritance

  

可能重复:
  Multiple Inheritance in C#

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

但是,我需要在MyClass中添加 ClassA和ClassB的功能:

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

public class MyClass : ClassA, ClassB
{
    /*Compilation error*/
}

有什么方法可以实现这个目标吗?

5 个答案:

答案 0 :(得分: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);
    }
}

如果您需要能够在需要ClassA的地方使用此课程,那么您可以添加转化运算符,将其转换回ClassAClassB 。是否更适合返回这些新实例或暴露内部实例是您需要仔细考虑的。

显然,如果ClassAClassB 实现任何接口,我建议您也在新课程中实现这些接口。

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

答案 1 :(得分:7)

如果您无法更改ClassAClassB,我建议为这些类创建子类型,然后进行汇总。

//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();
    }
}

答案 2 :(得分:1)

不,你不能从多个类继承。只允许多个接口继承。考虑使用组合代替:

public class MyClass : ClassA, IClassB
{
    private IClassB _classB; // delegate IClassB implementation to it

    public MyClass(IClassB classB)
    {
       _classB = classB;
    }

    public void BMethod()
    {
        _classB.BMethod();
    }
}

答案 3 :(得分:1)

为ClassA和ClassB创建一个接口(分别称为IClassA和IClassB),其中包含您想要访问的所有方法。

然后在ClassA和ClassB中实现该接口。

最后,让MyClass实现IClassA和IClassB:

public class MyClass : IClassA, IClassB
{
}

答案 4 :(得分:0)

您可以为ClassAClassB生成接口,然后从MyClass

中的2个接口继承