也許一些例子會解釋最好:
讓我們先從一個基類:
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";
}
現在當你調用輸出(),它返回「孩子」
new OverridingChild().Output(); // "Child"
而且如果你將它轉換爲一個家長,你會得到相同的結果:
((Parent) new OverridingChild()).Output(); // "Child"
如果你想在基類的價值,必須從繼承類中調用基:
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) new NewMethodChild()).WhatAmI(); // "Parent"
如果你調用的輸出方法,因爲它是在父類中定義它不會看到繼承類的新WhatAmI方法,所以它也輸出基準值:
new NewMethodChild().Output(); // "Parent"
。希望清除一切。
這沒有什麼理論。你試過了嗎? –