为什么要用`new`隐藏方法?可能重复:C#-方法签名中的新关键字假设我有3个类:GrandDad、Dad、Son。儿子继承祖父,儿子继承祖父。每个类都实现了foo。//GrandDadclass:publicvirtualvoidfoo()//Dadclass:newpublicvirtualvoidfoo()//Sonclass:publicoverridevoidfoo()不明白为什么爸爸会用new关键字。据我所知,使用新的隐藏方法。你为什么要这样做我阅读了新的MSDN解释,但讨论只是机械的,而不是体系结构的。感谢您提供的代码不是一个很好的例子,但是“新”的一个常见用例是修改基类以添加新方法(通常是您无法控制的基类),但是您现有的代码需要调用派生类的同名方法。将派生类方法更改为“新”允许您与公共接口的现有使用者保持兼容。希望以下示例能让您了解新关键字的用途。这实际上取决于功能的要求。publicclassBase{publicvirtualvoidSomeMethod(){}}publicclassDerived:Base{publicoverridevoidSomeMethod(){}}...Baseb=newDerived();b.SomeMethod();如果覆盖Base.SomeMethod,最终将调用Derived.SomeMethod。现在,如果您使用new关键字而不是override,派生类中的方法不会覆盖基类中的方法,它只是隐藏它。在这种情况下,代码如下所示:Derivedd=newDerived();b.SomeOtherMethod();d.SomeOtherMethod();首先调用Base.SomeOtherMethod,然后调用Derived.SomeOtherMethod。它们实际上是两个完全独立的方法,恰好具有相同的名称,而不是重写基方法的派生方法。可能的“有用”场景是当您在更多层(Control、Button、RedButton)上有一个类层次结构并且您想要限制给定类(Button)的任何子类以更改Control继承的通用行为时,即通过Button修改;RedButton可以通过Button规则而不是通过Control规则以其他方式成为TreeViewControl:)...;当您实现继承时可能会发生这种情况:)还有其他技术,更简洁,例如前一个场景的“策略模式”(您聚合行为,而不是继承)。我将举一个超出“它的作用”的例子,并在它有用的时候掩盖。您是否需要将其中一个业务类作为容器?例如,也许您想这样做:Personaperson=newPerson();aperson.Add(anAddress);aperson.Add(anAddress);如果您希望Add()方法在插入时执行一些特定于业务的逻辑,您可以选择。您可以自己实现容器功能(糟糕)或让Person类继承容器:publicclassPerson:List{}现在您可以在两种情况下获得所需的行为:)类,以及...使用“new”关键字来隐藏基本的List“添加”操作。new关键字是必需的,因为List.Add(...)不是虚拟的。这有点邪恶(可能是坏的),但在这种特殊情况下大多很酷。在您编写的“newAdd(...)”方法中,包含业务逻辑,然后调用基本的Add(...)方法。想让这个更酷吗?制作一棵树:publicclassNode:List{}在视频游戏中,我在编写游戏树时使用了这个技巧。好吧,这是你想要这样做的一个原因://GrandDad:publicvoidCanIWatchTv(){returnage>5;}//爸爸:爷爷太开明publicoverridevoidCanIWatchTv(){returnage>12;}//儿子:我不管爸爸怎么说!publicnewvoidCanIWatchTv(){返回真;换句话说,当您确实想覆盖(而不是关键字)基方法正在执行的操作而不是扩展它时,您可以使用new。在现实世界中,它应该谨慎使用,因为它违反了继承原则(如果允许儿子超越他的父亲——答案取决于你是儿子还是父亲,但在一个完美的世界中它应该是).我的理解是,主要动机之一与库的版本控制有关。1月1日:X公司发布了ClassDad作为SuperLibraryv1.0的一部分。爸爸类{virtualpublicvoidFoo(){...};}2月1日:您购买了SuperLibraryv1.0并创建了一个子类Son。类儿子:爸爸{publicvoidBar(){...};}3月1日:X公司发布SuperLibrary2.0,增加了一个名为Bar的新方法。他们不知道你也创建了一个方法Bar,他们的Bar完全不相关。爸爸类{virtualpublicvoidFoo(){...};virtualpublicvoidBar(){...};}5月1日:您购买了SuperLibraryv2.0并重新编译了您的Son类。令您惊讶的是,您发现他们添加了一个名为Bar的方法,该方法与您的冲突。为了尽量减少回归的风险,现在将Bar方法标记为一种新方法,以将其与X公司的Bar区分开来。虽然奇怪地同名,但两人却和平共处。他们现有的代码将按预期调用他们的Bar,而您现有的代码将按预期调用您的Bar。以上是C#学习教程:为什么要使用`new`隐藏方法?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——classSon:Dad{newpublicvoidBar(){...};}本文收集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
