在C#中使用扩展方法进行伪多重继承?

时间:2009-05-30 14:34:11

标签: c#-3.0 extension-methods dry multiple-inheritance

Similar question but not quite the same thing

我认为在接口相同的命名空间中使用扩展方法可以获得与多重继承类似的效果,因为您不需要在10个不同的类中以相同的方式实现相同的接口的重复代码。 / p>

这样做的一些缺点是什么?我认为专业人士非常明显,这是后来通常会再次咬你的缺点。

我看到的一个缺点是扩展方法不能是虚拟的,所以你需要确保实际上确实希望它们以相同的方式为每个实例实现。

2 个答案:

答案 0 :(得分:4)

我通过扩展方法看到的构建接口功能的问题是你不再实际实现接口,因此不能将该对象用作接口类型。

假设我有一个采用IBar类型对象的方法。如果我通过扩展方法在类Foo上实现IBar接口,那么Foo不是从IBar派生的,也不能与它互换使用(Liskov Substitution principle)。当然,我得到了我想要添加到Foo的行为,但我首先失去了创建接口的最重要方面 - 能够定义一个抽象合同,可以通过各种类以各种方式实现,以便依赖类不需要了解具体的实现。

如果我需要多次继承(并且到目前为止,我已经没有它),我认为我会使用组合来最小化代码重复的数量。

答案 1 :(得分:1)

考虑这个问题的一个不错的方法是实例方法是通过对象完成的,而扩展方法是 对象完成的事情。我相当确定框架设计指南说你应该尽可能实现一个实例方法。

接口声明“我关心使用此功能,但不关心它是如何实现的。”这使实施者可以自由选择方式。它将意图(一个公共API)与机制(一个具有特定代码的类)分离开来。

由于这是接口的主要优点,因此完全将它们作为扩展方法实现似乎会破坏它们的目的。即使IEnumerable<T>也有实例方法。

编辑:此外,对象还要对其包含的数据进行操作。扩展方法只能看到对象的公共API(因为它们只是静态方法);你必须暴露所有对象的状态才能使它工作(OO禁忌)。