也许一些例子能解释得最好:
让我们从一个基类开始:
public class Parent {
public virtual string WhatAmI() {
return "Parent";
}
public string Output() {
return this.WhatAmI();
}
}
调用输出方法当然会给你“父母”
new Parent().Output(); // "Parent"
现在让我们重写那个虚拟方法
public class OverridingChild : Parent {
public override string WhatAmI() {
return "Child";
}
现在当你调用 Output() 时,它会返回 "Child"
new OverridingChild().Output(); // "Child"
如果你将它转换为父级,你会得到相同的结果:
((Parent) new OverridingChild()).Output(); // "Child"
如果你想要基类的值,你必须从继承类中调用 base:
public class OverridingChild : Parent {
public override string WhatAmI() {
return "Child";
public string OutputBase() {
return base.WhatAmI();
}
}
new OverridingChild().OutputBase(); // "Parent"
现在是令人困惑的部分 - 以下是获取任一值的方法,具体取决于编译器认为该对象是什么类:
public class NewMethodChild : Parent {
// note that "new" keyword
public new string WhatAmI() {
return "Child";
}
当编译器认为它是继承类时直接调用该方法可以获得预期的结果:
new NewMethodChild().WhatAmI(); // "Child"
但是如果你将它转换为基类,你会得到 Parent 结果:
((Parent) new NewMethodChild()).WhatAmI(); // "Parent"
如果你调用Output方法,因为它是在Parent类中定义的,它看不到继承类的新WhatAmI方法,所以它也输出基值:
new NewMethodChild().Output(); // "Parent"
希望能解决问题。