当你控制基类时,是否应该使用新的而不是覆盖的情况?

问题描述:

当“新”有意义时,我遇到的例子涉及维护情况,其中子类从库中的基类继承,并且该库的新版本添加了一个与具有相同名称的方法已经在子类中实现。 (见: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;} 
} 
+1

不回答你的问题 - 但一个有趣的职位上使用(见Lippert先生的答案):http://*.com/questions/4348760/c-sharp-covariant-return-types-utilizing-泛型 – dugas 2012-03-14 19:51:37

+1

[This](http://*.com/a/3838692/1583)所以对另一个问题的回答详细说明了两种方法,其中方法隐藏可以是一个好设计。 – Oded 2012-03-14 20:18:43

+0

Eric Lippert的示例看起来比我发布的代码更清洁,当您将AppleBasket存储在FruitBasket变量中时,会导致各种有趣的事情。 – lgaud 2012-03-14 20:25:41

我知道的一种情况是,如果要将数据绑定到从另一个接口继承的接口,并且要绑定到基本接口中的成员,则必须在.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。

+0

这是否也适用于派生类和/或WPF绑定?或者它对WinForms中的接口非常具体? – lgaud 2012-03-19 11:23:40

+0

我不知道WPF绑定,但如果绑定到具体类而不是接口,则不会出现问题。但是,如果你绑定到具体的类,那么当你使用mock进行测试时你会失去灵活性。 – DeanOC 2012-03-19 19:17:03

我认为MSDN参考示出了其中new关键字可以是合理的: (MSDN reference: new Modifier)。例如,使用嵌套类的情况。

+1

MSDN文档不会评论他们是否认为他们的场景是良好的设计决策,只是它可以完成:) – lgaud 2012-03-14 20:12:02

+0

同意。但是在这个例子中嵌套类的使用提供了一个有趣的指导*如何使用它,这反过来可以帮助你理解在设计决策中不仅仅影响方法。 – code4life 2012-03-14 20:18:50