当你控制基类时,是否应该使用新的而不是覆盖的情况?
问题描述:
当“新”有意义时,我遇到的例子涉及维护情况,其中子类从库中的基类继承,并且该库的新版本添加了一个与具有相同名称的方法已经在子类中实现。 (见:Brittle Base Classes)当你控制基类时,是否应该使用新的而不是覆盖的情况?
我想知道的是,如果有的情况下,使用“新”是一个很好的设计选择(而不是在维护中可能成为必需的东西)。有一件事不能用override来完成,它改变了方法/属性的返回类型,同时保持名称相同,但我怀疑它是否是一个好的设计选择。
public class FruitBasket {
public int Weight { get; set;}
public List<Fruit> Fruits {get; set;}
}
public class AppleBasket : FruitBasket {
public new List<Apple> Fruits {get; set;}
}
答
我知道的一种情况是,如果要将数据绑定到从另一个接口继承的接口,并且要绑定到基本接口中的成员,则必须在.Net WinForms中使用new。
例如,如果你有
public interface IOne
{
int ID {get;set;}
string Code {get;set;}
}
public interface ITwo : IOne
{
DateTime CreatedDate {get;set;}
}
你数据绑定控件到ITwo的对象,那么你将无法看到ID或代码属性,除非你将它们添加到ITwo的接口。当然,你不必使用新的,但建议。
除此之外,我只使用它在维护模式,即一旦一个应用程序已经出货,新的需求需要这样的变化。
HTH, Dean。
不回答你的问题 - 但一个有趣的职位上使用(见Lippert先生的答案):http://stackoverflow.com/questions/4348760/c-sharp-covariant-return-types-utilizing-泛型 – dugas 2012-03-14 19:51:37
[This](http://stackoverflow.com/a/3838692/1583)所以对另一个问题的回答详细说明了两种方法,其中方法隐藏可以是一个好设计。 – Oded 2012-03-14 20:18:43
Eric Lippert的示例看起来比我发布的代码更清洁,当您将AppleBasket存储在FruitBasket变量中时,会导致各种有趣的事情。 – lgaud 2012-03-14 20:25:41