我一直在考虑使用扩展方法来替代抽象基类。扩展方法可以提供默认功能,并且可以通过将具有相同签名的方法放在派生类中来“覆盖”。
我有什么理由不这么做吗?
另外,如果我有两个具有相同签名的扩展方法,使用哪一个?有没有建立优先级的方法?
发布于 2009-01-23 19:16:12
我同意迈克尔的观点。基类应该包含所有的基本功能扩展方法,显然,应该扩展基本功能。在像Ruby这样的动态语言中,通常使用扩展方法来提供附加功能,而不是使用子类。基本上,扩展方法是用子类代替的,而不是用基类代替的。
我见过的唯一例外是,如果您有多个具有不同类层次结构的类型(如winform控件),您可以为每个类型创建一个子类,所有这些类型都实现和接口,然后扩展该接口,从而为一组不同的控件提供“基本”功能,而无需扩展像Control或Object这样的所有内容。
编辑:回答你的第二个问题
我想编译器会帮你捕捉到这一点。
发布于 2009-01-23 19:07:52
一般来说,你不应该通过扩展方法来提供“基础”功能。它们只能用来“扩展”类的功能。如果您可以访问基类代码,并且您尝试实现的功能在逻辑上是继承继承的一部分,那么您应该将其放在抽象类中。
我的意思是,你可以并不意味着你应该这样做。当普通的老式OO编程不能为您提供合理的解决方案时,最好还是坚持使用好的老式OOP,并使用新的语言特性。
发布于 2009-01-23 19:40:05
这绝对是个坏主意。扩展方法是静态绑定的,这意味着,除非您在编译时类型为子类型的对象上调用重写,否则仍将继续调用扩展方法。再见多态。This page很好地讨论了扩展方法的危险。
https://stackoverflow.com/questions/474074
复制相似问题