【问题标题】:Is there a convenient way to map all interface methods onto a subobject?有没有一种方便的方法可以将所有接口方法映射到子对象上?
【发布时间】:2011-09-24 09:46:19
【问题描述】:

假设我需要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 的所有方法,请调用此成员变量的相应方法”或其他方便的方式来进行如此大规模的重定向?

【问题讨论】:

  • 附带说明,Resharper 具有生成此类方法的功能。可以让你免于大量输入,但不会从杂乱的代码中拯救。 生成->委派成员
  • 正则表达式、控制台、复制、粘贴?哦等等你想要方便:)

标签: c# .net inheritance multiple-inheritance


【解决方案1】:

我知道痛苦。

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

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

您的代码如下所示:

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

class SecondRole : Role {
  ...
}

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

}

您还可以通过角色实现接口,并将它们传递给组合类。

【讨论】:

    【解决方案2】:

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

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

    很遗憾,C# 无法做到这一点,因为 CLI 不支持委托实现。

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 2022-11-18
        • 2013-01-09
        • 2016-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多