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

C# 衍生類別覆寫虛擬方法完整指南:簽章一致性、override 強制、多型實作範例

     編輯:關於C語言

前言

衍生類別覆寫基類虛擬方法有嚴格規則:方法名稱、回傳型別、參數個數/型別/順序必須完全一致,且必須加 override 關鍵字。本文完整說明覆寫規則、多型實作範例、動態綁定驗證。

一、覆寫規則:四個「必須一致」

修飾符規則

  • 必須加 override
  • 禁止加 new、static、virtual
  • 存取修飾符:不可比基類更嚴格(如基類 protected,衍生類不可 private)

二、完整多型範例:Vehicle → Car / Truck

using System;

// 基類:虛擬方法 Speak
class Vehicle
{
    public int Wheels { get; set; }
    protected float Weight { get; set; }
    
    public Vehicle(int w, float g) { Wheels = w; Weight = g; }
    
    public virtual void Speak()
    {
        Console.WriteLine("The vehicle is speaking!");
    }
}

// 衍生類:Car
class Car : Vehicle
{
    public int Passengers { get; set; }
    
    public Car(int w, float g, int p) : base(w, g)
    {
        Passengers = p;
    }
    
    public override void Speak()
    {
        Console.WriteLine("The car is speaking: Di-di!");
    }
}

// 衍生類:Truck
class Truck : Vehicle
{
    public int Passengers { get; set; }
    public float Load { get; set; }
    
    public Truck(int w, float g, int p, float l) : base(w, g)
    {
        Passengers = p;
        Load = l;
    }
    
    public override void Speak()
    {
        Console.WriteLine("The truck is speaking: Ba-ba!");
    }
}

// 測試多型
class Test
{
    public static void Main()
    {
        Vehicle v1 = new Vehicle();      // 基類實例
        Car c1 = new Car(4, 2f, 5);      // 衍生類實例
        Truck t1 = new Truck(6, 5f, 3, 10f);
        
        v1.Speak();  // 基類實例呼叫
        
        v1 = c1;     // 基類參考指向 Car 實例
        v1.Speak();  // 多型:呼叫 Car.Speak()
        c1.Speak();  // 直接呼叫
        
        v1 = t1;     // 基類參考指向 Truck 實例
        v1.Speak();  // 多型:呼叫 Truck.Speak()
        t1.Speak();  // 直接呼叫
    }
}

執行結果

The vehicle is speaking!
The car is speaking: Di-di!
The car is speaking: Di-di!
The truck is speaking: Ba-ba!
The truck is speaking: Ba-ba!

三、多型核心機制分析

關鍵觀察

  1. Vehicle v1 宣告為基類型別
  2. v1 = c1:基類參考指向衍生類實例(向上轉型,隱含轉換)
  3. v1.Speak():編譯期看靜態型別 Vehicle,執行期看動態型別 Car
  4. 虛擬方法表查找:v1 內部 __vptr 指向 Car 的 vtable → 找到 Car.Speak 位址 → 執行

動態多型 vs 靜態多型

  • 動態多型(執行期):虛擬方法覆寫,依實際物件型別決定行為
  • 靜態多型(編譯期):方法多載、泛型、擴充方法,依靜態型別決定

四、常見錯誤與編譯器檢查

項目要求說明
方法名稱完全相同區分大小寫
回傳型別完全相同C# 不支援協變回傳型別
參數個數完全相同
參數型別與順序完全相同含 ref/out/in 修飾符

五、進階:base 關鍵字呼叫基類實作

public override void Speak()
{
    base.Speak(); // 先執行基類邏輯
    Console.WriteLine("Car adds: Di-di!");
}
// 輸出:
// The vehicle is speaking!
// Car adds: Di-di!

六、總結

虛擬方法覆寫鐵律:

  1. 基類 virtual 宣告可覆寫
  2. 衍生類 override 實作,簽章完全一致
  3. 基類參考指向衍生類實例 → 呼叫虛擬方法 → 動態綁定 到衍生類實作
  4. 這就是執行期多型:同一介面,不同行為,由物件實際型別決定

掌握此機制,是設計可擴充、符合開放封閉原則(OCP)類別階層的基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤代碼原因範例
CS0506基類方法非虛擬,無法 override基類無 virtual,衍生類加 override
CS0115方法簽章不匹配參數型別不同、回傳型別不同
CS0239override 與 new 衝突同時加了兩個修飾符
CS0505override 與 static 衝突靜態方法屬於類別,非實例