WEB开发网
开发学院软件开发C语言 Effective C# 原则29:仅在对基类进行强制更新时才... 阅读

Effective C# 原则29:仅在对基类进行强制更新时才使用new修饰符

 2009-02-19 08:16:15 来源:WEB开发网   
核心提示: 建议大家避免使用new修饰符来重新定义非虚函数,这并不要太多的解释,Effective C# 原则29:仅在对基类进行强制更新时才使用new修饰符(2),就像推荐大家在定义一个基类时应该用虚方法一样,一个类库的设计者应该按照合某种约设计虚函数,而这正是你所渴望的,于是你立即购买并编译你的M

建议大家避免使用new修饰符来重新定义非虚函数,这并不要太多的解释,就像推荐大家在定义一个基类时应该用虚方法一样。一个类库的设计者应该按照合某种约设计虚函数。也就表示你期望任何派生类都应该修改虚函数的实现。虚函数的集合就相当于是定义了一个行为的集合,这些行为是希望在派生中重新实现的。设计默认的虚函数就是说派生可以修改类中的所有虚的行为。这确实是说你不想考虑所有派生类可能要修改行为的分歧问题。相反,你可以把时间花在考虑把什么样的方法以及属性设计成多态的。当然,只有它们是虚行为的时候才能这样做。不要考虑这样会限制类的用户。相反,应该认为这是给类型的用户定义行为提供了一个入口向导。

有且只有一种情况要使用new修饰符,那就是把类集成到一个已经存在的基类上时,而这个基类中已经使用了存在的方法名,这时就要使用new了(译注:就是说基类与派生类都已经存在了,是后来添加的继承关系,结果在添加继承关系时,发现两个类中使用了同样的方法名,那么就可以在派生类中添加一个new来解决这个问题)。因为有些代码已经依懒于类的方法名,或者已经有其它程序集在使用这个方法。例如你在库中创建了下面的类,使用了在另一个库中定义的BaseWidget:

public class MyWidget : BaseWidget
{
 public void DoWidgetThings( )
 {
  // details elided.
 }
}

你完成了你的widget, 而且用户可以使用它。然而你却发现BaseWidget公司发布了一个新的版本。而这正是你所渴望的,于是你立即购买并编译你的MyWidget类。结果失败了,因为BaseWidget的家伙们已经添加了他们自己的DoWidgetThings 方法:

public class BaseWidget
{
 public void DoWidgetThings()
 {
  // details elided.
 }
}

Tags:Effective 原则 进行

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接