覆盖扩展方法

Jos*_*ers 24 c#

我一直在考虑使用扩展方法作为抽象基类的替代.扩展方法可以提供默认功能,并且可以通过在派生类中放置相同签名的方法来"覆盖".

我不应该这样做的原因?

另外,如果我有两个具有相同签名的扩展方法,使用哪一个?有没有办法确定优先权?

Mic*_*ows 12

通常,您不应通过扩展方法提供"基本"功能.它们只应用于"扩展"类功能.如果您可以访问基类代码,并且您尝试实现的功能在逻辑上是继承层次结构的一部分,那么您应该将它放在抽象类中.

我的观点是,仅仅因为你可以并不意味着你应该.当普通的OO编程无法为您提供合理的解决方案时,通常最好只使用优秀的老式OOP并使用更新的语言功能.


Dav*_*Ray 8

这绝对是一个坏主意.扩展方法是静态绑定的,这意味着,除非您对编译时类型为子类型的对象调用覆盖,否则您仍将继续调用扩展方法.再见多态性.这个页面很好地讨论了扩展方法的危险.


Jac*_*ams 3

我同意迈克尔的观点。显然,基类应该包含所有基本功能扩展方法应该扩展基本功能。在像 Ruby 这样的动态语言中,通常使用扩展方法来提供附加功能,而不是使用子类。基本上,扩展方法是用来替换使用子类的,而不是替换使用基类的。

我见过的唯一例外是,如果您有多种具有不同类层次结构的类型(例如 winform 控件),您可以为每个类型创建一个子类,然后扩展该接口,从而提供“基”功能到一组不同的控件,而不需要扩展诸如控件或对象之类的所有内容。

编辑:回答你的第二个问题

我认为编译器会为你捕捉到这一点。