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

C# 抽象類別與密封類別深度解析:abstract、sealed、覆寫與隱藏

     編輯:關於C#

抽象類別

核心規則

  • abstract class:不可實例化,僅供繼承。
  • 可包含抽象成員 (無實作) 與具體成員 (有實作)。
  • 抽象成員:abstract 修飾,隱含 virtual,不可加 static/virtual。
  • 衍生類必須實作所有抽象成員 (除非衍生類也是 abstract)。
  • 實作抽象成員需用 override。

抽象成員類型

abstract class Shape
{
    public abstract int Area { get; }           // 抽象屬性 (唯讀)
    public abstract void Draw();                // 抽象方法
    public abstract event EventHandler Changed; // 抽象事件
    public abstract int this[int i] { get; }    // 抽象索引子
    
    // 具體成員
    public void Print() => Console.WriteLine($"Area: {Area}");
}

密封類別與密封成員

sealed class

  • 禁止繼承 (sealed class Leaf { })。
  • 不可與 abstract 共用 (邏輯互斥)。
  • 隱含將繼承來的虛擬成員變為非虛擬 (JIT 可內聯優化)。
  • 不能新增虛擬成員。

sealed override (密封覆寫)

class Base { public virtual void M() {} }
class Middle : Base 
{ 
    public sealed override void M() {} // 封鎖進一步覆寫
}
class Leaf : Middle 
{ 
    // public override void M() {} // 編譯錯誤
}

抽象覆寫

衍生類可將虛擬成員重新聲明為抽象,強制下一層實作:

class Base { public virtual void M() {} }
abstract class Middle : Base 
{ 
    public abstract override void M(); // 抽象覆寫
}
class Leaf : Middle 
{ 
    public override void M() {} // 必須實作
}

新修飾符:隱藏而非覆寫

class Base { public void M() {} }
class Derived : Base 
{ 
    public new void M() {} // 隱藏基類 M
}

// 行為差異
Base b = new Derived(); b.M(); // 呼叫 Base.M (非虛擬)
Derived d = new Derived(); d.M(); // 呼叫 Derived.M
  • new 僅影響靜態綁定 (透過衍生類型別參考)。
  • 不可與 override 共用。
  • 編譯器警告 CS0108 (建議加 new 明確意圖)。

綜合範例:多層繼承鏈

abstract class Animal
{
    public abstract void Speak();
    public virtual void Move() => Console.WriteLine("Moving");
}

abstract class Mammal : Animal
{
    public sealed override void Move() => Console.WriteLine("Mammal moving");
    // Speak 仍為抽象
}

class Dog : Mammal
{
    public override void Speak() => Console.WriteLine("Woof");
    // Move 已密封,不可覆寫
}

class Cat : Mammal
{
    public override void Speak() => Console.WriteLine("Meow");
}

設計決策指南

需求選擇
定義契約、強制實作、共享部分邏輯abstract class
純契約、多重實作、無共享狀態interface
葉節點類別、效能關鍵、禁止擴充sealed class
中間層鎖定特定行為、禁止進一步變化sealed override
修正基類設計缺失、非多型情境new (隱藏)

總結

abstract 與 sealed 是繼承體系的兩極:一個要求必須擴充,一個禁止擴充。override、sealed override、abstract override、new 構成四種繼承語意,精準表達設計意圖。掌握它們,能建構清晰、安全且可演進的類別階層。

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