有没有一种方便的方法可以将所有接口方法映射到子对象上

本文关键字:方法 接口 映射 对象 一种 有没有 方便 | 更新日期: 2023-09-27 18:00:31

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

有没有一种方便的方法可以将所有接口方法映射到子对象上

脑海中浮现的不是简单的语言功能,这里有一些想法:

  1. 使用.NET4.0 DynamicObject,您可以在其中动态添加属性/成员
  2. 使用面向方面的优先编程或IL Weaving来添加一个mixin。例如,请参见PostSharp
  3. 使用某种形式的代码生成,例如ReSharper

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

我想几乎每个经验丰富的C#开发人员都可能在某个阶段希望这样做,尤其是那些曾经是Delphi开发人员的人。它被称为"委托执行",在Delphi中有售。

事实上,负责这个Delphi功能的人Steve Teixeira现在在MSFT工作。这里有一个博客条目,他谈到了这件事。

不幸的是,C#无法做到这一点,因为CLI不支持通过委派实现。

我知道疼痛。

以至于我开始了自己的项目来解决这个问题:NRoles。

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

你的代码看起来是这样的:

class FirstRole : Role {
  public void FirstMethod() { ... }
  public void SecondMethod() { ... }
}
class SecondRole : Role {
  ...
}
class MyClass : Does<FirstRole>, Does<SecondRole> {
}

您还可以通过角色实现接口,这些接口将被传递到组成类中。

相关文章: