跳至頁尾內容
.NET 幫助

C# 密封類別(開發者如何理解其工作原理)

在物件導向程式設計的世界裡,C# 語言為開發人員提供了一套多樣化的工具來設計和實作穩健的軟體。 其中一個為類別繼承增加額外控制層的功能是封閉類的概念。 封閉類別提供了一種限制繼承階層的獨特方式,提供了在某些情況下有利的安全性與封閉性。 在本文中,我們將深入探討 C# sealed 類別的複雜性,同時也會探討 IronPDF 來自 Iron Software 的 NuGet 套件。

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

封閉類別:在 C# 中,封閉類別是一個無法繼承的類別。 透過使用 sealed 關鍵字,開發人員可以防止其他類別從 sealed class 派生或延伸。 這種刻意的限制可確保封閉類無法用作任何其他類別的基類,限制了繼承階層的範圍。 當開發人員想要控制並確定類的結構,防止透過繼承進行意外修改時,通常會使用封閉類。

請考慮以下範例:

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 的 struct 不同,sealed 類必須使用 sealed 關鍵字來宣告,如上圖所示。 在這個範例中,Animal 類宣告為 sealed,使得任何其他的類別無法繼承自它。

封閉方法:除了封閉整個類別之外,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.使用封閉方法來保持穩定性:當一個方法的核心行為應該在不同的子類中保持穩定時,封閉方法是有益的。 這可以增強程式碼的可預測性。 5.It Cannot Also be Abstract:封閉的類別/封閉的方法不能同時也是抽象的類別/抽象的方法,因為抽象的類別是設計給其他類別繼承的,而封閉的類別則限制繼承。

介紹 IronPDF。

C# Sealed Class (How It Works For Developers):圖 1 - IronPdf 網頁

IronPDF 是來自 Iron Software 的 C# PDF 函式庫,是現代化的 PDF 產生器和閱讀器。

安裝

IronPdf 可使用 NuGet 套件管理員控制台或 Visual Studio 套件管理員進行安裝。 以下是控制台的指令:

Install-Package IronPdf

或使用 NuGet Package Manager 安裝 IronPDF,請在 NuGet Package Manager 的搜尋列中搜尋"ironpdf"。

C# Sealed Class (How It Works For Developers):圖 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();
        }
    }

    // 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# Sealed Class (How It Works For Developers):圖 3 - 控制台輸出,顯示執行指令和任何結果控制台訊息

以下是 IronPDF 生成的 PDF

C# Sealed Class (How It Works For Developers):圖 4 - 使用之前的程式碼範例所產生的 PDF 輸出

授權(可免費試用)

IronPDF. 此 key 需要放在 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 函式庫?

您可以透過 NuGet 套件管理器安裝 C# PDF 庫,例如 IronPDF,方法是使用命令dotnet add package IronPdf或在 Visual Studio NuGet 套件管理器中搜尋「ironpdf」。

在軟體設計中使用密封類別時需要考慮哪些因素?

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

對於 C# 開發人員,建議使用哪一種 PDF 產生器?

IronPDF 是推薦給 C# 開發人員的 PDF 產生器,它以 NuGet 套件的形式提供強大的 PDF 建立和操作功能。

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

Jacob Mellor 是 Iron Software 的首席技術官,也是一位富有遠見的工程師,率先開發了 C# PDF 技術。作為 Iron Software 核心程式碼庫的最初開發者,他自公司成立之初便參與塑造了其產品架構,並與執行長 Cameron Rimington 一起將其發展成為一家擁有 50 多名員工、服務於 NASA、特斯拉和全球政府機構的公司。

Jacob 於 1998 年至 2001 年在曼徹斯特大學獲得土木工程一級榮譽學士學位。 1999 年,他在倫敦創辦了自己的第一家軟體公司;2005 年,他創建了自己的第一個 .NET 元件。此後,他專注於解決微軟生態系統中的複雜問題。

他的旗艦產品 IronPDF 和 IronSuite .NET 庫在全球 NuGet 上的安裝量已超過 3000 萬次,其基礎程式碼持續為全球開發者工具提供支援。憑藉 25 年的商業經驗和 41 年的程式設計專長,Jacob 始終致力於推動企業級 C#、Java 和 Python PDF 技術的創新,同時指導下一代技術領導者。