【发布时间】:2021-09-16 13:10:20
【问题描述】:
所以new modifier 隐藏了一个方法而不是覆盖它...
我能想到的情况几乎为零,这对代码的开发人员、维护人员和客户来说是有用的并且不会混淆。
什么是实际使用这个修饰符来阴影方法的好例子?
即一个例子
- 不仅仅是打印一个简单的字符串来演示修饰符的作用,
- 在哪里使用
new而不是override显然是有利的,并且 - 这不是“我想覆盖我不允许覆盖的东西”(因为这 [a] 只是糟糕的设计,而 [b] 可能会导致非常混乱的代码行为)
【问题讨论】:
-
docs.microsoft.com/en-us/previous-versions/visualstudio/… 是的,在实践中,它很少有用。要理解的关键是
new有两个方面。 a) 支持阴影。 b) 需要明确了解您正在跟踪的事实。 b) 是主要的好处 - 它突出了阴影,而不会让您意外这样做。 -
另见 softwareengineering.stackexchange.com/questions/153738/… 和 docs.microsoft.com/en-us/archive/blogs/ericlippert/…(请特别阅读
GetEnumerator位,因为它提供了一个很好的例子)。 -
我想你可以用它来实现静态计数,例如游戏中的敌人,其中 Base.Count 将是总敌人数,而 Derived.Count 将是特定敌人类型数(以及与静态计数器或统计数据等交互的一些方法)
-
@mjwills 这些是解决问题的有趣链接。一个用例是在代码演化过程中,当一个方法被添加到与我已经添加到派生类中的方法同名的基类中(例如,在我无法控制的外部 API 中)。最快的解决方法是隐藏方法(尽管从长远来看,使用不同的名称重构可能更好。)
标签: c# inheritance polymorphism shadowing