.NET 幫助

C# 密封類(開發者如何使用)

里根普恩
里根普恩
2024年2月18日
分享:

在物件導向程式設計的世界中,C#語言為開發者提供了一套多功能的工具來設計和實現健全的軟體。 添加到類別繼承中的一個附加控制層的功能就是密封類別的概念。 密封類提供了一種獨特的方式來限制繼承階層,在某些情況下可以提供有益的安全性和封裝。 在本文中,我們將深入探討 C# sealed 類的複雜性,並且還會探討IronPDFNuGet 套件來自Iron Software.

什麼是密封類和密封方法?

密封類別: 在 C# 中,密封類別是一種無法被繼承的類別。 通過使用 sealed 關鍵字,開發人員可以防止其他類別從該 sealed 類別衍生或擴展。 此刻意的限制確保密封類別無法用作其他類別的基礎類別,從而限制繼承階層的範圍。 密封類通常在開發人員希望控制並確定類的結構時使用,以防止通過繼承進行意外修改。

請考慮以下示例:

public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}
public sealed class Animal
{
    public string Species { get; set; }
    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal // Error: Cannot be inherited 
{
}

與隱式封閉的結構不同,密封類必須使用如上所示的 sealed 關鍵字來聲明。 在此範例中,Animal 類別被宣告為密封,使得其他任何類別無法從中繼承。

密封方法: 除了封裝整個類別之外,C# 還允許開發者在類別中封裝個別的方法。 密封方法是一種任何衍生類別都無法覆蓋的方法。這確保了方法的行為在所有子類中保持一致,為應用程式的邏輯提供了一定程度的可預測性。

要封裝方法,請使用 sealed 修飾符:

public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

虛擬(virtual)關鍵字允許在衍生類別中覆寫方法,而密封(sealed)關鍵字則防止在任何後續子類中進一步覆寫基類的虛擬方法。

密封類別和類別成員:密封類別也可以包含密封成員,例如屬性、方法和事件。 這種密封類和密封成員的組合確保了對類行為和結構的高度控制。

請考慮以下示例:

public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}
public sealed class ControlledClass
{
    public sealed string ControlledProperty { get; set; }
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
    }
    // Sealed event
    public sealed event EventHandler ControlledEvent;
    // Sealed indexers, if applicable
    public sealed string this [int index]
    {
        get { return "Value"; }
        set { /* Setter implementation */ }
    }
}

在這個例子中,ControlledClass 的每一個方面都是密封的,包括屬性、方法、事件,甚至適用的話也包括索引子。 此級別的封裝提供了一種堅固不可更改的結構,非常適合需要保持類設計固定的情況。

密封類的基本原理

程式碼安全性: 密封類透過防止未授權訪問和修改來增強程式碼安全性。 當一個類被封閉時,它作為一個具有明確定義界面和行為的封閉實體。 這種封裝減少了意外副作用或更改的風險,這些可能會潛在地危害代碼庫的穩定性和安全性。

設計完整性: 在較大的代碼庫或框架中,維持設計完整性是至關重要的。 密封類作為具有固定結構的基礎構建塊,減少了非預期修改的可能性。 這在一個類別作為系統核心組件的場景中特別有利,並且它的行為應在不同模塊中保持一致。

使用密封類的最佳實踐

  1. 謹慎使用 Sealed 類別:雖然 sealed 類別具有優勢,但應該謹慎使用。 過度使用密封類可能導致代碼變得僵化且難以維護。

  2. 文件意圖:當封裝一個類或方法時,記錄此決策背後的意圖是至關重要的。 解釋為什麼特定類別是密封的,以及哪些設計考量導致了這個選擇。

  3. 考慮未來的可擴充性:在封裝類之前,請考慮未來的需求是否可能需要可擴充性。 如果某個類別有可能需要擴展,將其密封可能會阻礙未來的開發。

  4. 使用密封方法以保持穩定性:當方法的核心行為應在不同的子類別中保持穩定時,使用密封方法會很有幫助。 這可以增強程式碼的可預測性。

  5. 不能同時為抽象: 封閉類別/封閉方法不能同時為抽象類別/抽象方法,因為抽象類別旨在被其他類別繼承,而封閉類別限制繼承。

介紹 IronPDF

C# 封閉類別(對開發人員的運作方式):圖1 - IronPDF 網頁

IronPDF是一個來自 的 C# PDF 庫Iron Software並且是一個現代的 PDF 生成器和閱讀器。

安裝

IronPDF 可以使用以下方法安裝:NuGet使用封裝管理器主控台或Visual Studio封裝管理器。 以下是控制台的命令:

dotnet add package IronPdf

或者,使用 NuGet 套件管理器安裝 IronPDF,在 NuGet 套件管理器的搜尋欄中搜尋「ironpdf」。

C# 密封类(如何为开发人员工作):图2 - 通过NuGet包管理器安装IronPDF库

IronPDF和密封類別

結合 sealed 關鍵字和 IronPDF 可以防止子類別庫或衍生類別庫重寫繼承的成員,並生成 PDF。

namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}
namespace OrderBy;
public class Program
{
    static void Main()
    {
        Console.WriteLine("Demo Sealed Class and IronPdf");
        var dog = new Dog();
        dog.MakeSound();
        dog.Print();
    }
}
// Sealed base class
public class Animal
{
    public string Species { get; set; }
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public virtual void Print()
    {
        Console.WriteLine("Generic animal Print");
    }
}
public class Dog : Animal
{
    public sealed override void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
    public sealed override void Print()
    {
        var pdfDocument = new ChromePdfRenderer();
        string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, Dog!</h1>
<p>This is Print from Derived class.</p>
<p>Print Animal Dog</p>
<p>Print Animal Sound: Bark</p>
</body>
</html>";
        pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
    }
}

C# 密封類別(對開發人員的運作方式):圖3 - 控制台輸出,顯示執行命令和任何產生的控制台訊息

以下是由 IronPDF 生成的 PDF

C# 封閉類別(對開發者的運作方式):圖 4 - 使用前述程式碼範例生成的輸出 PDF

授權(免費試用可用)

IronPDF. 此鍵需要放置在 appsettings.json 中。

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"

提供您的電子郵件以獲取試用許可證。

結論

C# 密封類別為開發人員提供了一種強大的機制,以控制繼承層次結構,並確保某些類別及其成員無法被擴展或覆蓋。 雖然使用密封類應該謹慎考慮,但它們提供了封裝功能和防止意外修改的有效方法。 透過了解密封類別和方法的概念,開發者可以知曉何時及何地運用這種限制,進而有助於打造可維護、安全且可預測的軟體系統。 除了 IronPDF,我們還可以打印 PDF 文件。

里根普恩
軟體工程師
Regan 畢業於雷丁大學,擁有電子工程學士學位。在加入 Iron Software 之前,他的工作角色讓他專注於單一任務;而他在 Iron Software 工作中最喜歡的是他所能承擔的工作範圍,無論是增加銷售價值、技術支持、產品開發或市場營銷。他喜歡了解開發人員如何使用 Iron Software 庫,並利用這些知識不斷改進文檔和開發產品。
< 上一頁
C# 優先佇列(開發者如何使用)
下一個 >
C# LINQ Join 查詢語法(對開發者的工作原理)