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

C# 抽象類別與介面的差異與選擇指南

     編輯:關於C語言

一、抽象類別

  • 特殊類別,**不可實例化**;除此具備一般類別特性 (欄位、方法、屬性、建構函式等)。
  • 可包含抽象方法 (無實作,衍生類必須覆寫),也可包含虛擬/實體方法。
  • 可繼承另一個抽象類別,可選擇覆寫或不覆寫基類抽象方法 (不覆寫則由更下層衍生類實作)。
  • 支援單一繼承。

二、介面

  • 參考型別,類似類別但不可實例化。
  • 所有成員隱含 public,不可包含私有/受保護成員。
  • 可包含方法、屬性、索引子、事件,**不可包含** 常數、欄位、建構函式、解構函式、靜態成員 (C# 8.0 前)。
  • 類別可實作多個介面,但只能繼承一個類別 (含抽象類)。
  • 支援回呼模式 (介面作為契約)。

三、核心差異比較

特性抽象類別介面
本質對「物件」的抽象 (is-a)對「行為/契約」的規範 (can-do)
繼承/實作單一繼承多重實作
預設實作可提供 (虛擬/實體方法)C# 8.0 前不可,8.0+ 可提供 default 實作
成員存取層級可控制 (public/protected/private)隱含 public
欄位/建構函式可有不可有 (C# 8.0 前)
密封不可密封不適用
方法虛擬性實體方法預設 virtual實作方法預設 non-virtual (可標記 virtual)

四、選擇指南

  1. 預計多版本組件 → 抽象類別 (版本控制容易,新增非抽象成員不破壞現有衍生類)。
  2. 功能跨越廣泛異質物件 → 介面 (如 IDisposable, IComparable)。
  3. 小而單一功能區塊 → 介面 (單一職責,避免介面污染)。
  4. 大型功能單元、共享通用實作 → 抽象類別。
  5. 關係緊密的物件階層 → 抽象類別;鬆散關係共享功能 → 介面。

五、經典比喻

  • 飛機/鳥 實作 IFly (介面);F22 繼承 FighterJet 抽象類,鴿子 繼承 Bird 抽象類。
  • 門 (抽象類) 定義「是什麼」 (鐵門/木門);鎖 (介面) 定義「能做什麼」。一個門可有鎖、門鈴 (多介面)。介面污染 = 鎖被迫會發聲音。

六、進階:抽象類別實作介面

抽象類別可將介面方法對應至抽象方法,不提供實作,交由具體衍生類實現,達到契約傳遞效果。

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