有没有方便的方法将所有接口方法映射到子对象?

时间:2011-06-28 14:55:23

标签: c# .net inheritance multiple-inheritance

假设我需要inherit from two classes in C#。这是不允许的,所以我可以执行以下操作:从其中一个类继承并将另一个类作为成员变量包含,从其接口继承并通过将它们重定向到该成员变量来重新实现这些接口的所有方法:

interface SecondBaseInterface {
    void FirstMethod();
    void SecondMethod();
};

class MyClass : FirstBaseClass, SecondBaseInterface {

   public void FirstMethod()
   {
      secondBase.FirstMethod();
   }

   public void SecondMethod()
   {
      secondBase.SecondMethod();
   }

   SecondBaseClass secondBase = new SecondBaseClass();
};

现在这样可行,但是如果SecondBaseInterface中有很多方法,则需要大量输入代码,实际上没有任何用处,我将不得不维护代码SecondBaseInterface变化。

是否有一些C#功能会告诉编译器“对于SecondBaseInterface的所有方法,请调用此成员变量的相应方法”或其他一些方便的方法来进行大规模重定向?

4 个答案:

答案 0 :(得分:1)

我也想有机会,但我认为它不存在。但是,不要害怕这样做,如果你真的需要一个可以充当它的超类的类:它是众所周知的delegation pattern(你可能知道)。

答案 1 :(得分:1)

没有简单的语言功能可以想到,这里有一些想法:

  1. 使用.NET4.0 DynamicObject,您可以在其中添加属性/成员。
  2. 使用面向方面的Priogramming或IL Weaving添加mixin。例如,请参阅PostSharp
  3. 使用某种形式的代码生成,例如ReSharper

答案 2 :(得分:1)

我认为几乎每个经验丰富的C#开发人员都可能希望在某个阶段 - 尤其是那些曾经是Delphi开发人员的人。它被称为“委托实施”,它在Delphi中可用。

事实上,负责这个Delphi功能的人Steve Teixeira现在在MSFT工作。 Here's a blog entry他在那里谈论它。

不幸的是,C#无法执行此操作,因为CLI不支持委派实现。

答案 3 :(得分:1)

我知道痛苦。

我开始自己的项目来解决这个问题:NRoles

这为C#带来了trait (pdf)的形式。

您的代码如下所示:

class FirstRole : Role {
  public void FirstMethod() { ... }
  public void SecondMethod() { ... }
}

class SecondRole : Role {
  ...
}

class MyClass : Does<FirstRole>, Does<SecondRole> {

}

您还可以通过角色实现接口,并将它们转移到撰写类。