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

Posted

技术标签:

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

我该怎么做:

Class A : DependencyObject 

Class B : DependencyObject 

Class C : A , B 

【问题讨论】:

【参考方案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# 中进行多重继承,但您可以实现多个接口:

    使用与 A 的公共成员相同的方法创建一个接口 使用与 B 的公共成员相同的方法创建一个接口 在 C 中为 A 和 B 创建成员变量。 从 A 和 C 实现 A 接口(C 的实现只是调用其类型 A 的成员变量) 从 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
    

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

【讨论】:

以上是关于如何在 C# 中模拟多重继承的主要内容,如果未能解决你的问题,请参考以下文章

多重继承,虚基类

C# 应该有多重继承吗? [关闭]

C#中继承问题

unittest 模拟和多重继承:TypeError:元类冲突

第53课 被遗弃的多重继承

Python基础编程——多重继承下方法的调用