关于.net:如何在C#中模拟多重继承?

How to emulate multiple inheritance in C#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Multiple Inheritance in C#

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

但是,我需要在myclass中添加classa和classb的特性:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ClassA
{
    /* Third party class*/
}
public class ClassB
{
    /* Third party class*/
}

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

我有什么办法可以做到吗?


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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语言。


如果不能更改ClassAClassB,我建议为这些类创建子类型,然后进行聚合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//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();
    }
}


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

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

最后,让MyClass实现IClassA和IClassB:

1
2
3
public class MyClass : IClassA, IClassB
{
}


不,不能从多个类继承。只允许多个接口继承。考虑改用合成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MyClass : ClassA, IClassB
{
    private IClassB _classB; // delegate IClassB implementation to it

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

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

您可以为ClassAClassB生成接口,然后从MyClass中的2个接口继承。