.Net 3.5 中的新扩展允许功能从接口中分离出来。
例如在 .Net 2.0
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
List<IChild> GetChildren()
}
可以(在 3.5 中)变为:
public interface IHaveChildren {
string ParentType { get; }
int ParentId { get; }
}
public static class HaveChildrenExtension {
public static List<IChild> GetChildren( this IHaveChildren ) {
//logic to get children by parent type and id
//shared for all classes implementing IHaveChildren
}
}
在我看来,这对于许多接口来说是一种更好的机制。他们不再需要一个抽象的基础来共享此代码,并且在功能上代码的工作方式相同。这可以使代码更易于维护和测试。
唯一的缺点是抽象基实现可以是虚拟的,但可以解决这个问题(实例方法会隐藏同名的扩展方法吗?这样做会混淆代码吗?)
还有其他不经常使用这种模式的理由吗?
澄清:
是的,我看到扩展方法的趋势是到处都有它们。在没有大量同行评审的情况下,我会特别小心地使用任何.Net 值类型(我认为我们在字符串上唯一的一个是.SplitToDictionary()
- 类似于.Split()
但也采用键值分隔符)
我认为那里有一个完整的最佳实践辩论;-)
(顺便说一句:DannySmurf,你的 PM 听起来很吓人。)
我在这里特别询问在以前我们有接口方法的地方使用扩展方法。
我试图避免很多层次的抽象基类——实现这些模型的类大多已经有了基类。我认为与添加更多对象层次结构相比,该模型更易于维护且耦合更少。
这是 MS 对 Linq 的 IEnumerable 和 IQueryable 所做的吗?