首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# virtual、override、abstract、sealed 關鍵字深度解析:多型實作機制

     編輯:關於C#

方法修飾詞總覽

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

常見錯誤與最佳實務

  • 忘記 virtual:基類未標記,衍生類用 new 隱藏而非覆寫,多型失效。
  • 覆寫時漏寫 override:編譯器警告 CS0114,建議明確加上 override 或 new。
  • 建構函式呼叫虛擬方法:基類建構函式執行時衍生類尚未初始化,呼叫 override 方法會操作未就緒欄位,極危險。
  • 介面 vs 抽象類別:純行為契約用介面;需共享實作或狀態用 abstract class。

IL 層面觀察

callvirt 指令用於虛擬/介面方法呼叫,執行期查閱方法表;call 用於靜態/非虛擬/基類明確呼叫。理解此差異有助於效能調優與除錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved