接口+扩展方法(mixin)比抽象类更好吗?
如果你的答案是“这取决于”,那么它取决于什么?
我认为接口+扩展方法有两个可能的优点。
- 接口是可多重继承的,而类则不能。
- 您可以使用扩展方法以不间断的方式扩展接口。 (实现您的接口的客户端将获得您的新基本实现,但仍然能够覆盖它。)
我还没有想到这种方法的缺点。接口+扩展方法失败的原因可能很简单。
关于这个主题的两篇有用的文章是
- 使用接口和扩展方法创建 Mixins http://msdn.microsoft.com/en-us/vcsharp/bb625996.aspx
- 抽象基类也有版本控制问题 http://haacked.com/archive/2008/02.aspx
扩展方法的缺点:C#3/VB9 之前的客户端将无法轻松使用它。
就我而言,就是这样 - 我认为基于界面的方法要好得多。然后,您可以很好地模拟您的依赖关系,并且所有内容基本上都不太紧密耦合。我不太喜欢类继承,除非它真的是关于专业化:)
编辑:我刚刚想到了另一个好处might具有相关性。某些具体实现可能可以提供某些通用方法的更优化版本。
Enumerable.Count
就是一个很好的例子 - 它显式检查序列是否实现IList
或不,因为如果它可以调用Count
在列表上而不是迭代整个序列。如果IEnumerable<T>
是一个带有虚拟的抽象类Count()
方法,它可能已被重写List<T>
而不是有一个单一的实现知道IList
明确地。我并不是说这总是相关的,也不是说IEnumerable<T>
应该是一个抽象类(绝对不是!) - 只是指出它是一个可能的小缺点。这就是多态性真正合适的地方,通过专门化现有的行为(诚然,以一种只影响性能而不影响结果的方式)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)