當衍生類別覆寫虛擬方法時,可加上 sealed 禁止後續衍生類別再次覆寫:
class Parent {
public virtual void Method1() { Console.WriteLine("Method1"); }
public virtual void Method2() { Console.WriteLine("Method2"); }
public virtual void Method3() { Console.WriteLine("Method3"); }
}
class Child1 : Parent {
public override void Method1() { Console.WriteLine("New Method1"); }
public override void Method2() { Console.WriteLine("New Method2"); }
// 封鎖 Method3,後代無法再覆寫
public sealed override void Method3() { Console.WriteLine("New Method3"); }
}
// 密封類別:完全禁止繼承
sealed class Child2 : Child1 {
public override void Method1() { Console.WriteLine("New New Method1"); }
public sealed override void Method2() { Console.WriteLine("New New Method2"); }
// 編譯錯誤:無法覆寫 sealed 方法
// public override void Method3() { }
}
class Program {
static void Main() {
Child2 obj = new Child2();
obj.Method1(); // New New Method1
obj.Method2(); // New New Method2
obj.Method3(); // New Method3 (來自 Child1)
Console.ReadKey();
}
}
| 修飾詞 | 適用對象 | 效果 |
|---|---|---|
sealed class | 類別 | 禁止被繼承,隱含所有虛擬方法皆視為 sealed |
sealed override | 方法/屬性 | 禁止後續衍生類別覆寫,必須搭配 override |
virtual | 方法/屬性 | 允許覆寫,預設非 sealed |
<remarks>Sealed because...</remarks>。private virtual 在 C# 中非法;密封是針對繼承鏈,而非存取層級。