從閱讀你的問題和你的意見看來,實際的解決方案可能不是在代碼中,而是在理解。
當覆蓋方法(其具有是一個虛擬方法,然後才能將其覆蓋),該方法是呼籲編譯時間類型
的該類型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:如果你明白這不是陰影,請停止叫它重寫......並且你沒有聲明你*有*完全防止陰影 - 你說過你*想要*。如果你有*,你應該立即放棄,或選擇不同的語言。 –