跳過到頁腳內容
.NET幫助

C# 密封類 (對開發者如何運作)

在物件導向程式設計的世界中,C# 語言為開發者提供了多功能的工具集來設計和實現健全的軟體。 這樣的一個特徵就是密封類別的概念,為類別繼承增加了一層額外的控制。 密封類別提供了一種獨特的方法來限制繼承階層,提供了一定的安全性和封裝,在某些情境中可能是有利的。 在本文中,我們將深入探討 C# 的密封類別的細微差別,並且探索來自 Iron Software 的 IronPDF NuGet 套件。

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

密封類別: 在 C# 中,密封類別是一種不能被繼承的類別。 透過使用 sealed 關鍵字,開發者可以防止其他類別從密封類別中派生或擴展。 這種刻意的限制確保了密封類別不能作為任何其他類別的基礎類別來使用,限制了繼承階層的範圍。 密封類別通常用於當開發者希望控制並最終完善類別結構時,防止通过继承进行意外的修改。

請考慮以下範例:

public sealed class Animal
{
    public string Species { get; set; }

    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }
public sealed class Animal
{
    public string Species { get; set; }

    public void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }
$vbLabelText   $csharpLabel

與結構體不同,結構體是隱式密封的,密封類別必須使用上面的 sealed 關鍵字聲明。 在此範例中,Animal 類是一個被聲明為密封的類別,使其不可能被任何其他類別繼承。

密封方法: 除了封裝整個類別之外,C# 也允許開發者封裝類別中的個別方法。 密封方法是一種派生類別無法覆寫的方法。這確保了該方法的行為在所有子類中保持一致,從而提供了一個應用程式邏輯的可預測性。

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

public class Animal
{
    public string Species { get; set; }

    // A virtual method allows derived classes to override it.
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

public class Dog : Animal
{
    // The sealed override prevents further overriding of this method.
    public sealed override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}
public class Animal
{
    public string Species { get; set; }

    // A virtual method allows derived classes to override it.
    public virtual void MakeSound()
    {
        Console.WriteLine("Generic animal sound");
    }
}

public class Dog : Animal
{
    // The sealed override prevents further overriding of this method.
    public sealed override void MakeSound()
    {
        Console.WriteLine("Bark!");
    }
}
$vbLabelText   $csharpLabel

virtual 關鍵字允許該方法在派生類別中被覆寫,而 sealed 關鍵字阻止在後續子類中的基類虛擬方法被進一步覆寫。

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

請考慮以下範例:

public sealed class ControlledClass
{
    // A sealed property that prevents overriding.
    public sealed string ControlledProperty { get; set; }

    // A method that cannot be redefined by derived classes.
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
        Console.WriteLine("Executing controlled method.");
    }

    // A sealed event that cannot be subscribed to or raised by derived classes.
    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
{
    // A sealed property that prevents overriding.
    public sealed string ControlledProperty { get; set; }

    // A method that cannot be redefined by derived classes.
    public virtual sealed void ControlledMethod()
    {
        // Method implementation
        Console.WriteLine("Executing controlled method.");
    }

    // A sealed event that cannot be subscribed to or raised by derived classes.
    public sealed event EventHandler ControlledEvent;

    // Sealed indexers, if applicable
    public sealed string this[int index]
    {
        get { return "Value"; }
        set 
        { 
            // Setter implementation 
        }
    }
}
$vbLabelText   $csharpLabel

在此範例中,ControlledClass 的每一個方面都被密封——屬性、方法、事件,甚至索引器(如果適用)。 這種封裝等級提供了一個健全且不可更改的結構,非常適合於類別設計應保持固定的情境。

密封類別背後的理由

程式碼安全性: 密封類別透過防止未經授權的存取和修改來提高程式碼的安全性。 當類別被密封,作為一個封閉實體,具有明確定義的介面和行為。 這種封裝將意外副作用或更改的風險降至最低,防止可能會危及程式碼庫的穩定性和安全性。

設計完整性: 在大型程式碼庫或框架中,維護設計完整性至關重要。 密封類別作為具有固定結構的基礎構建塊,降低了意外修改的機會。 這在類別作為系統核心組件,其行為應在不同模組中保持一致的情境中特別有利。

使用密封類別的最佳實踐

  1. 謹慎使用密封類別: 雖然密封類別提供了一些優勢,但應謹慎使用。 密封類別的過度使用可能會導致代碼僵化且難以維護。
  2. 文件意圖: 當封裝類別或方法時,記錄此決策背後的意圖非常重要。 說明為何某個類別被密封以及哪些設計考量導致這個選擇。
  3. 考慮未來的擴展性: 在封裝類別之前,考慮未來的需求是否可能需要擴展。 如果有可能需要擴展某個類別,則封裝它可能會阻礙未來的開發。
  4. 使用密封方法以達到穩定性: 當方法的核心行為應在不同子類中保持穩定時,封裝方法可能是有利的。 這可以Enhance代碼的預測性。
  5. 它不能同時是抽象的: 密封類別/密封方法也不能是抽象類別/抽象方法,因為抽象類別旨在被其他類別繼承,而密封類別限制了繼承。

介紹IronPDF

 C# 密封類別(對開發者來說如何運作):圖 1 - IronPDF 網頁

IronPDF 是來自 Iron Software 的 C# PDF 程式庫,也是現代 PDF 生成器和閱讀器。

安裝

IronPDF 可以使用 NuGet 套件管理器控制台或使用 Visual Studio 套件管理器進行安裝。 以下是控制台命令:

Install-Package IronPdf

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

 C# 密封類別(對開發者來說如何運作):圖 2 - 透過 NuGet 套件管理器安裝 IronPDF 程式庫

IronPDF 和密封類別

一起使用時,密封關鍵字和 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();
        }
    }

    // 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
    {
        // Sealed override ensures method cannot be overridden in further derived classes.
        public sealed override void MakeSound()
        {
            Console.WriteLine("Bark!");
        }

        public sealed override void Print()
        {
            var pdfRenderer = 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>";

            pdfRenderer.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();
        }
    }

    // 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
    {
        // Sealed override ensures method cannot be overridden in further derived classes.
        public sealed override void MakeSound()
        {
            Console.WriteLine("Bark!");
        }

        public sealed override void Print()
        {
            var pdfRenderer = 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>";

            pdfRenderer.RenderHtmlAsPdf(content).SaveAs("dog.pdf");
        }
    }
}
$vbLabelText   $csharpLabel

 C# 密封類別(對開發者來說如何運作):圖 3 - 控制台輸出,顯示執行指令和任何由此產生的控制台訊息

以下是由 IronPDF 生成的 PDF

 C# 密封類別(對開發者來說如何運作):圖 4 - 以先前程式碼範例生成的 PDF

授權 (提供免費試用)

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

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

提供您的電子郵件以獲取試用授權。

結論

C# 的密封類別為開發者提供了一個強大的機制來控制繼承階層,確保某些類別及其成員不能被擴展或覆寫。 雖然應慎重考慮使用密封類別,但它們提供了一種將功能封裝並防止非預期修改的有效方法。 通過了解密封類別和方法的概念,開發者可以關於何時及何處應用此限制做出明智的決策,有助於創建可維護、安全和預測的軟體系統。 配合 IronPDF,我們也可以列印 PDF 文件。

常見問題解答

C# 中的密封類是如何運作的?

在 C# 中,密封類是使用sealed關鍵字定義的。這防止其他類繼承自它,確保類的實現保持不變。

為什麼開發人員應該在 C# 中使用密封類?

密封類用來通過防止繼承來維護代碼的完整性。這確保類的行為保持一致和安全,特別是在設計完整性至關重要的大型系統中。

密封類可以有也被密封的方法嗎?

是的,密封類可以包含自身也是密封的方法。這意味著這些方法不能在衍生類中被重寫,進一步增強了類功能的安全性和一致性。

在類中使用密封方法有什麼好處?

密封方法可防止衍生類重寫,這有助於保持方法的原始行為,確保一致性並防止意外修改。

你能提供什麼時候使用密封類的例子嗎?

當您想要通過防止通過繼承進行更改來鎖定類的實現時,例如在工具類或處理需要穩定性的敏感操作時,密封類是有用的。

密封類與 C# 中的 PDF 生成有何關聯?

當使用像 IronPDF 這樣的 PDF 庫時,可以利用密封類來確保 PDF 生成過程保持一致和安全,通過防止通過繼承進行修改。

能否將密封類與像 IronPDF 這樣的第三方庫一起使用?

是的,密封類可以與像 IronPDF 這樣的第三方庫一起使用,以便將 PDF 生成邏輯封裝在安全、不可繼承的類結構中。

我如何使用 NuGet 安裝 C# PDF 庫?

您可以通過使用命令dotnet add package IronPDF或在 Visual Studio 的 NuGet 套件管理器中搜索 'ironpdf' 安裝 C# PDF 庫,如 IronPDF。

在軟件設計中使用密封類需要考慮哪些問題?

開發人員應考慮未來的可擴展性需求並記錄密封類的原因。使用密封類可以增強安全性和可維護性,但應與應用程序所需的靈活性權衡。

推薦的 C# 開發人員使用的 PDF 生成器是什麼?

IronPDF 是 C# 開發人員推薦的 PDF 生成器,提供作為 NuGet 套件的強大 PDF 創建和操作功能。

Jacob Mellor, Team Iron 首席技術官
首席技術官

Jacob Mellor是Iron Software的首席技術官,也是開創C# PDF技術的前瞻性工程師。作為Iron Software核心代碼庫的原始開發者,他自公司成立以來就塑造了公司的產品架構,並與CEO Cameron Rimington將公司轉型為服務NASA、Tesla以及全球政府機構的50多人公司。

Jacob擁有曼徹斯特大學土木工程一級榮譽學士學位(1998年–2001年)。他於1999年在倫敦開立首家軟體公司,並於2005年建立了他的第一個.NET組件,專注於解決Microsoft生態系統中的複雜問題。

他的旗艦作品IronPDF和Iron Suite .NET程式庫全球已獲得超過3000萬次NuGet安裝,他的基礎代碼不斷在全球各地驅動開發者工具。擁有25年以上的商業經驗和41年的編碼專業知識,Jacob仍然專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me