类似的问题,但并不完全是一回事

我在想,在同一个命名空间扩展的方法作为接口,你可以在获得多重继承类似的效果,你不需要有重复的代码实现相同的接口,在10个不同类别的方式相同。

有哪些这样做的缺点吗?我认为,优点是很明显的,那就是平时回来以后咬你的缺点。

一个我看到的缺点之一是,扩展方法不能是虚拟的,所以你需要确保你其实希望他们实施了每一个实例以同样的方式。

没有正确的解决方案

其他提示

,我通过扩展方法与建筑物接口能力看到的问题是,你是不再实际上实现该接口,所以不能使用对象作为接口类型。

说我有采用类型IBAR的物体的方法。如果我在实现通过扩展方法类Foo伊巴尔接口,那么富不从伊巴尔派生,并不能与它(里氏替换原则)互换使用。当然,我得说我要加入到富的行为,但我失去了在第一时间创建接口的最重要的方面 - 能够定义可在各种各种类,这样的方式来实现一个抽象的合同从属类不需要知道具体实现。

如果我需要多重继承(到目前为止我住没有它)严重的是,我想我会使用组合物,而不是最小化的重复代码的量。

要想想这一个体面的方式就是实例方法是通过的对象,而扩展方法是什么所做的一切的东西的的对象。我相当肯定的框架设计指南说,只要有可能,应实现的实例方法。

这是接口声明“我在乎使用此功能,但它不是如何完成的。”这使得实施者可以自由选择如何。它分离的意图,一个公共API,从机制,用实际代码的类。

由于这是接口的主要好处,完全实现它们作为扩展方法似乎打败他们的目的。甚至IEnumerable<T>有一个实例方法。

修改:另外,对象是指作用于它们所包含的数据。扩展方法只能看到一个对象的公共API(因为他们只是静态方法);你就必须公开所有对象的状态,使其工作(一种面向对象的禁忌)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top