衍生類別覆寫 (override) 方法時,若需呼叫「基底類別的基底類別」同名方法,無法直接使用 base.Method() (僅能呼叫直接基底)。
class A {
public virtual void Func() { Console.WriteLine("A"); }
}
class B : A {
public new void Func() { Console.WriteLine("B"); } // 隱藏 A.Func
}
class C : B {
public void Func() {
A a = (A)this; // 轉型為 A
a.Func(); // 呼叫 A.Func
}
}
new 在 B 隱藏 A.Func,B.Func 為非虛擬 (除非另加 virtual)。this 轉型為 A,靜態型別為 A,編譯期綁定 A.Func。virtual 且 C 未覆寫,執行期仍呼叫 A.Func (符合預期)。
class B : A {
public override void Func() {
base.Func(); // 呼叫 A.Func
Console.WriteLine("B");
}
}
class C : B {
public override void Func() {
base.Func(); // 呼叫 B.Func (含 A.Func)
Console.WriteLine("C");
}
}
override + base.Method() 即可層層呼叫。