从阅读你的问题和你的意见看来,实际的解决方案可能不是在代码中,而是在理解。
当覆盖方法(其具有是一个虚拟方法,然后才能将其覆盖),该方法是呼吁编译时间类型
的该类型regardsless的任何对象有关的说明在覆盖和隐藏差见下文
public class BaseClass {
public virtual void MyVirtual(){
Console.writeLine("Base virtual");
}
public void MyNonVirtual(){
Console.WriteLine("Base non virtual");
}
}
public class Derived : BaseClass {
public virtual void MyVirtual(){
Console.writeLine("Derived virtual");
}
public new void MyNonVirtual(){
Console.WriteLine("Derived non virtual");
}
}
BaseClass b = new BaseClass();
Derived d = new Derived();
BaseClass dAsb = d;
b.MyVirtual(); //prints Base virtual
b.MyNonVirtual(); //print Base non virtual
d.MyVirtual(); //prints Derived virtual
d.MyNonVirtual(); //print Derived non virtual
dAsb.MyVirtual(); //prints Derived virtual
dAsb.MyNonVirtual(); //print Base non virtual
通知的代码,最后一行将不使用,但从基类b在派生所定义的方法,所述方法因为它不是虚拟的编译时间类型决定哪个方法将被调用并且编译时间类型dAsb
是BaseClass。因此即使d
和dAsb
是完全相同的对象,因为编译时间类型不同,所以会调用两个不同的方法。 无论有人隐藏非虚拟方法,任何使用BaseClass编写的代码都会按预期工作。
@ZaheerAhmed:这个*不是*覆盖,正如我所说的。它是阴影,你无法阻止它。阴影方法虽然不会被称为多态。 –
@ZaheerAhmed:如果你明白这不是阴影,请停止叫它重写......并且你没有声明你*有*完全防止阴影 - 你说过你*想要*。如果你有*,你应该立即放弃,或选择不同的语言。 –