C# 方法宣告語法:可視性 修飾詞 回傳型別 方法名(參數列表) { 主體 }。修飾詞互斥,僅能從以下選一:
| 關鍵字 | 中文名 | 用途 |
|---|---|---|
| static | 靜態 | 屬於類別,不屬於實例,編譯期綁定 |
| virtual | 虛擬 | 允許衍生類覆寫,執行期動態綁定 |
| override | 覆寫 | 覆寫基類 virtual/abstract 方法 |
| abstract | 抽象 | 無主體,強制衍生類實作,隱含 virtual |
| sealed | 密封 | 禁止進一步覆寫,需搭配 override |
public class Base
{
public virtual void Hello() => Console.WriteLine("Hello from Base");
}
public class Derived : Base
{
public override void Hello() => Console.WriteLine("Hello from Derived");
}
class Program
{
static void Main()
{
Base obj = new Derived();
obj.Hello(); // 輸出: Hello from Derived
}
}
關鍵點:
virtual,衍生類用 override 覆寫。static 方法無法標記 virtual,因屬於類別非實例。
public abstract class Animal
{
public abstract void Speak(); // 必須實作
public virtual void Move() => Console.WriteLine("Moving..."); // 可選覆寫
}
public class Dog : Animal
{
public override void Speak() => Console.WriteLine("Wang!");
public sealed override void Move() => Console.WriteLine("Running fast"); // 禁止再覆寫
}
// public class Puppy : Dog { public override void Move() { } } // 編譯錯誤:Move 已 sealed
new 隱藏而非覆寫,多型失效。override 或 new。callvirt 指令用於虛擬/介面方法呼叫,執行期查閱方法表;call 用於靜態/非虛擬/基類明確呼叫。理解此差異有助於效能調優與除錯。