我一直在阅读c#规范,遇到了一个我没有预料到的场景,希望有人能分享一些光。
我偶然发现了new
关键字,用于在派生类中隐藏基类的成员,随后讨论了何时在virtual
成员上使用new
而不是override
。
我在IDE中添加了一个小代码示例,希望看到编译错误
public class BaseType
{
public void method()
{
// do nothing
}
}
public class DerivedType : BaseType
{
public new void method()
{
base.method();
}
}
但却发现这是法律的的c#。既然派生类已经隐藏了method()
的存在,为什么我仍然被允许调用它?
干杯
2条答案
按热度按时间bybem2ql1#
DerivedType
对继承DerivedType
的类隐藏了方法,而不是对它自己。注意,为了隐藏方法,类必须知道在它的父类中存在一个同名且参数相同的方法。因此,一个类在它自己的作用域中隐藏方法在逻辑上是不正确的。
6yjfywim2#
不要把方法 hiding 和方法 overriding 混在一起,它们是两种完全不同的东西。
当隐藏一个方法时,只有在通过隐藏方法的类型访问该方法时才隐藏它:
现在我们有以下行为:
注意,即使
Blah
被声明为virtual
,这种行为也是一样的。有趣的是第三次调用。该方法通过Foo
类型的对象调用。由于它不是虚调用,因此调用的是Foo.Blah()
,而不是DerivedFoo.Blah()
。现在这与 method overriding 完全不同,其中虚方法调用总是解析为对象的运行时类型,而不是您调用它的类型:
现在我们有以下行为: