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

C# 抽象類別深度解析:定義規則、實例化限制與繼承鏈實作

     編輯:關於C#

抽象類別核心定義

使用 abstract 修飾詞的類別,表示「不完整的型別」,不可直接實例化,僅能作為基類被繼承。它定義「是什麼」的契約,留白「怎麼做」給衍生類別。

三大鐵律

繼承鏈強制實作機制


public abstract class A
{
    public abstract void DoWork(); // 抽象方法
}

public abstract class B : A
{
    // B 未實作 DoWork → B 必須也標記 abstract
    public void Helper() { } // 可加入具體實作
}

public class C : B
{
    // C 必須實作所有繼承的抽象成員
    public override void DoWork() => Console.WriteLine("C does work");
}

規則:第一個非抽象衍生類別必須實作所有祖先鏈上的抽象成員。

抽象類別 vs. 介面:選擇指南

規則說明違反後果
不可實例化new AbstractClass() 編譯錯誤CS0144
不可為 sealedabstract sealed class 互斥CS0509
可包含抽象/非抽象成員不強制要有 abstract 成員純非抽象抽象類別合法 (單純防止實例化)

實戰範例:交通工具體系


public abstract class Vehicle
{
    public int Wheels { get; protected set; }
    protected float Weight { get; set; }

    protected Vehicle(int wheels, float weight)
    {
        Wheels = wheels;
        Weight = weight;
    }

    // 抽象方法:每種交通工具鳴笛聲不同
    public abstract void Honk();

    // 虛方法:預設行為可選擇覆寫
    public virtual void StartEngine() => Console.WriteLine("Engine starting...");
}

public class Car : Vehicle
{
    public int Passengers { get; }
    public Car(int passengers) : base(4, 1500f) => Passengers = passengers;

    public override void Honk() => Console.WriteLine("Beep beep!");
    public override void StartEngine() => Console.WriteLine("Car engine roaring!");
}

public class Truck : Vehicle
{
    public float LoadCapacity { get; }
    public Truck(float capacity) : base(6, 5000f) => LoadCapacity = capacity;

    public override void Honk() => Console.WriteLine("Hooooonk!");
}

抽象屬性與索引器


public abstract class Entity
{
    public abstract int Id { get; protected set; } // 抽象屬性
    public abstract string this[string key] { get; set; } // 抽象索引器
}

衍生類別必須以 override 實作完整存取子 (get/set)。

建構函式在抽象類別中的角色

  • 抽象類別可以有建構函式,供衍生類別透過 base(...) 呼叫
  • 用於初始化共用欄位、驗證必要參數、強制子類別提供建構資訊
  • 無法直接被外部呼叫 (因不可實例化)

常見設計模式應用

場景建議理由
共用程式碼 (欄位、建構函式、預設實作)抽象類別介面無法包含實例狀態
單一核心身分、強 is-a 關係抽象類別單一繼承語意清晰
跨層級、橫切關注點、多重組合介面多重實作、無狀態
API 公開給第三方擴充介面不鎖死繼承鏈

總結

抽象類別是「不完整的具體類別」:它擁有狀態、建構函式、具體實作,同時宣告必須由子類別完成的抽象契約。善用它可在單一繼承限制下,最大程度共用程式碼並強制領域規則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模式抽象類別角色
Template Method定義演算法骨架,抽象步驟交由子類別實作
Factory Method抽象建立方法,具體工廠決定實例化型別
Strategy (基類版)定義策略介面,預設實作為抽象/虛方法