【问题标题】:How to emulate multiple inheritance in C#? [duplicate]如何在 C# 中模拟多重继承? [复制]
【发布时间】:2012-12-25 19:24:00
【问题描述】:

可能重复:
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*/
}

有什么方法可以实现吗?

【问题讨论】:

  • 聚合,也许?
  • 你不能。改用接口(允许多个接口)和composition...
  • 不继承但包含ClassA和/或ClassB怎么办?还是您愿意覆盖 ClassA 和 ClassB 的成员?
  • 它与我的课程不同的是第三方课程。

标签: c# .net inheritance


【解决方案1】:

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# 限制。

【讨论】:

    【解决方案2】:

    如果您无法更改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();
        }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      最后,让 MyClass 实现 IClassA 和 IClassB:

      public class MyClass : IClassA, IClassB
      {
      }
      

      【讨论】:

      • 但是我需要在 MyClass 中实现 IClassA 和 IClassB 的所有方法。
      • MyClass 可以包含 ClassA 的实例字段和 ClassB 之一。然后你的 IClassA 和 IClassB 的实现可以在实例字段上调用适当的方法。
      【解决方案4】:

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

      public class MyClass : ClassA, IClassB
      {
          private IClassB _classB; // delegate IClassB implementation to it
      
          public MyClass(IClassB classB)
          {
             _classB = classB;
          }
      
          public void BMethod()
          {
              _classB.BMethod();
          }
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-08
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 2017-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          相关资源
          最近更新 更多