【问题标题】:How to simulate multiple inheritance in C#如何在 C# 中模拟多重继承
【发布时间】:2011-03-13 02:43:03
【问题描述】:

我该怎么做:

Class A : DependencyObject {}

Class B : DependencyObject {}

Class C : A , B {}

【问题讨论】:

    标签: c# inheritance class multiple-inheritance


    【解决方案1】:

    C#没有多重继承,所以一行

    Class C : A , B {}
    

    永远不会工作。不过,您可以使用接口做类似的事情,就像

    interface InterfaceA { void doA(); } 
    class A : InterfaceA { public void doA() {} }
    
    interface InterfaceB { void doB(); }
    class B : InterfaceB { public void doB() {}}
    
    class C : InterfaceA, InterfaceB
    {
      m_A = new A();
      m_B = new B();
    
      public void doA() { m_A.doA(); }
      public void doB() { m_B.doB(); } 
    }
    

    【讨论】:

      【解决方案2】:

      您不能在 C# 中进行多重继承,但您可以实现多个接口:

      1. 使用与 A 的公共成员相同的方法创建一个接口
      2. 使用与 B 的公共成员相同的方法创建一个接口
      3. 在 C 中为 A 和 B 创建成员变量。
      4. 从 A 和 C 实现 A 接口(C 的实现只是调用其类型 A 的成员变量)
      5. 从 B 和 C 实现 B 接口(C 的实现只是调用其 B 类型的成员变量)

      【讨论】:

      • 或者您可以使用合成并开辟自己的道路。 :)
      【解决方案3】:

      不能,C# 不支持类的多重继承。

      如果您提供一个更具体的示例来说明您正在尝试做什么,也许我们可以为您提供更好的解决方案(例如,您所追求的也许是组合,而不是继承 - 当然,我可以'从这个简单的例子中可以看出)。

      【讨论】:

        【解决方案4】:

        您不能让C 既是A 又是B,除非其中一个继承自另一个。

        但是,如果您希望 C 具有来自 AB 的行为,但它们并不共同,请使用接口。

        【讨论】:

          【解决方案5】:

          无论好坏,C# 都不支持多重继承。但是,我使用extension methods 模拟它的成功有限。扩展方法方法可能如下所示。

          public class A
          {
            public void DoSomething() { }
          }
          
          public static class B
          {
            public static void DoSomethingElse(this A target) { }
          }
          
          public class C : A
          {
          }
          

          这里明显的问题是C 绝对不是B。所以这唯一的好处是在某些情况下避免重复代码。

          另一方面,C# 确实支持实现多个接口。它看起来像这样。

          public interface IA
          {
            void DoSomething();
          }
          
          public interface IB
          {
            void DoSomethingElse();
          }
          
          public class A : IA
          {
            void DoSomething() { }
          }
          
          public class B : IB
          {
            void DoSomethingElse() { }
          }
          
          public class C : IA, IB
          {
            private A m_A = new A();
            private B m_B = new B();
          
            public void DoSomething() { m_A.DoSomething(); }
          
            public void DoSomethingElse() { m_B.DoSomethingElse(); }
          }
          

          这里明显的问题是,当您继承接口时,您并没有继承实现。这有利于多态性,但不利于避免重复代码。

          有时您可以同时使用这两种策略来将类似于多重继承的东西组合在一起,但它可能难以理解和维护。如果您的情况确实需要多重继承,那么您的选择将是有限的,当然也不理想,但它们确实存在。

          【讨论】:

          • 我碰巧认为 C# 排除 MI 更糟。但那是因为我主要认为复杂性论点被夸大了。我想我们都有自己的意见,但这是我最直言不讳的一个......当然是好是坏:)
          【解决方案6】:

          另一种方式,不使用组合,使用扩展方法。定义没有方法的接口,并用您的 C 类实现它们。然后,编写一个带有扩展方法的静态类,为您的接口提供实现。

          public static void MyMethod(this InterfaceA a)
          {
              // do stuff with a
          }
          

          这样做的缺点是您只能使用在接口中定义的对象的那些属性。这基本上限制了您自动实现的属性和方法调用。

          【讨论】:

            【解决方案7】:

            所以我猜它不能这样做......

            class A : DependencyObject
                {
                    public int X
                    {
                        get { return (int)GetValue(XProperty); }
                        set { SetValue(XProperty, value); }
                    }
                    public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(int), typeof(A), new UIPropertyMetadata(0));
                }
            
                class B : DependencyObject
                {
                    public int X
                    {
                        get { return (int)GetValue(XProperty); }
                        set { SetValue(XProperty, value); }
                    }
                    public static readonly DependencyProperty XProperty = DependencyProperty.Register("X", typeof(int), typeof(B), new UIPropertyMetadata(0));
                }
            
                class C : DependencyObject
                {
                    A a = new A();
                    B b = new B();
                    public int X
                    {
                        get { return a.X; }
                        set { a.X = value; }
                    }
                    public int Y
                    {
                        get { return b.X; }
                        set { b.X = value; }
                    }
                }
            

            【讨论】:

              【解决方案8】:

              您可以通过多级继承来实现这一点...

               public class DependencyObject
              {
                  public void DependencyObjectMethod() { }
              }
              
              public class A : DependencyObject
              {
                  public void MethodA() { }
              }
              
              public class B : A
              {
                  public void MethodB() { }
              }
              
              public class C : B
              {
                  public void MethodC()
                  {
                      //Do Something
                  }
              }
              

              通过这种方式,您可以访问这些类的所有方法和属性。

              【讨论】:

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