1

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

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

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

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

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

有什么办法可以做到这一点?

4

5 回答 5

8

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

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

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

    int BMethod(int value)
    {
      return b.BMethod(value);
    }
}

如果您需要能够在需要 a 的位置使用此类ClassA,则可以添加转换运算符以将其转换回ClassAor ClassB。此时返回这些新实例或公开您的内部实例是否更合适是您需要仔细考虑的一个问题。

显然,如果ClassAClassB 确实实现了任何接口,我建议您在新类上也实现这些接口。

但是,归根结底,C# 没有多重实现继承。如果你需要这样的(这是罕见的),那么 C# 不是合适的语言。任何其他 CLR 语言也不是,因为这是 CLR 限制,而不是 C# 限制。

于 2013-01-11T08:35:24.090 回答
7

If you cannot change ClassA and ClassB I suggest creating subtypes for these classes and then aggregating.

//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();
    }
}
于 2013-01-11T08:39:59.327 回答
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();
    }
}
于 2013-01-11T08:35:09.200 回答
1

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

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

最后,让 MyClass 实现 IClassA 和 IClassB:

public class MyClass : IClassA, IClassB
{
}
于 2013-01-11T08:35:30.017 回答
0

您可以生成一个接口ClassAClassB然后从 2 个接口继承MyClass

于 2013-01-11T08:34:52.003 回答