现实生活中使用 new 关键字来隐藏虚拟方法实现?时间:2019-03-17 标签:c#
在现实生活中,我们将使用 new 为派生类中的虚拟方法提供新的实现是什么? C#
我知道它在技术上意味着什么。我正在寻找的是一个需要这样做的现实生活场景。
我们总是可以通过提供覆盖功能来实现相同的目的。当方法调用被强制转换为基类时,为什么我们要选择不正确的方法。
What's the real life scenario where we will use new to provide new implementation for a virtual method in the derived class? C#
I know what it means technically. what I am looking for is a real life scenario where this will be needed.
We can always achieve the same by providing the override functionality. Why would we want to incorrect method been picked when methods call is made casted to base.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(3)
不,您不能通过重写来实现相同的目的:
- 指定新方法允许您改变返回类型
- 调用基本方法可能不会不正确
一个示例场景:
- 您正在使用第 3 方库 Foo,其中包含类 FooBase
- 您编写自己的 Foo 子类,Bar
- 您在 Bar 中引入了一个名为 DoSomething 的公共方法
- 在 Foo 的下一个版本中,第 3 方在 Foo 中引入了一个 DoSomething 方法,该方法与你的方法不一样。这可能是也可能不是虚拟的。
此时,您希望调用 Bar.DoSomething 的所有现有代码仍然调用 Bar.DoSomething,但所有调用 Foo.DoSomething 的代码仍应调用该实现 -这些调用者甚至可能不知道您的方法,并且他们可能位于第三方程序集中。
从长远来看,在这种情况下,如果可以的话,您可能希望重命名您的方法(取决于您对调用者的控制程度),但从短期来看,将您的方法设置为 new
可以完全实现你想要的行为。
这类问题有时被称为“脆弱基类”问题。 Eric Lippert 已经写了相当广泛的文章,包括
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
不,你无法实现同样的目标。
现在,如果您尝试执行此操作:
结果将是:
Override 始终覆盖,而 new 仅在用作其声明类型(而不是基类型)时才执行。
您可以在此处查看更多信息
No. You can't achieve the same.
Now, if you try to do this:
The result will be:
Override ALWAYS override while new ONLY does it when is used as its declared type (not base one).
You can see more here