跳過到頁腳內容
.NET幫助

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

在物件導向程式設計的世界裡,C# 語言為開發人員提供了一套多樣化的工具來設計和實作穩健的軟體。 其中一個為類別繼承增加額外控制層的功能是封閉類別的概念。 封閉類別提供了一種限制繼承階層的獨特方式,在某些情況下可帶來安全性與封閉性上的優勢。 在本文中,我們將深入探討 C# sealed 類別的複雜性,同時也會探討 IronPDF 來自 Iron Software 的 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'
// {
// }
Public NotInheritable Class Animal
	Public Property Species() As String

	Public Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class

' 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 類別被宣告為 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!");
    }
}
Public Class Animal
	Public Property Species() As String

	' A virtual method allows derived classes to override it.
	Public Overridable Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class

Public Class Dog
	Inherits Animal

	' The sealed override prevents further overriding of this method.
	Public NotOverridable Overrides Sub MakeSound()
		Console.WriteLine("Bark!")
	End Sub
End Class
$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 
        }
    }
}
Public NotInheritable Class ControlledClass
	' A sealed property that prevents overriding.
	Public NotOverridable Property ControlledProperty() As String

	' A method that cannot be redefined by derived classes.
	Public Overridable NotOverridable Sub ControlledMethod()
		' Method implementation
		Console.WriteLine("Executing controlled method.")
	End Sub

	' A sealed event that cannot be subscribed to or raised by derived classes.
	Public Event ControlledEvent As EventHandler

	' Sealed indexers, if applicable
	Default Public NotOverridable Property Item(ByVal index As Integer) As String
		Get
			Return "Value"
		End Get
		Set(ByVal value As String)
			' Setter implementation 
		End Set
	End Property
End Class
$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");
        }
    }
}
Namespace OrderBy
	Public Class Program
		Shared Sub Main()
			Console.WriteLine("Demo Sealed Class and IronPdf")
			Dim dog As New Dog()
			dog.MakeSound()
			dog.Print()
		End Sub
	End Class

	' Base class
	Public Class Animal
		Public Property Species() As String

		Public Overridable Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub

		Public Overridable Sub Print()
			Console.WriteLine("Generic animal Print")
		End Sub
	End Class

	Public Class Dog
		Inherits Animal

		' Sealed override ensures method cannot be overridden in further derived classes.
		Public NotOverridable Overrides Sub MakeSound()
			Console.WriteLine("Bark!")
		End Sub

		Public NotOverridable Overrides Sub Print()
			Dim pdfRenderer = New ChromePdfRenderer()
			Dim content As String = "
            <!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")
		End Sub
	End Class
End Namespace
$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 庫?

您可以通過使用命令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技術的創新,同時指導下一代技術領導者。

鋼鐵支援團隊

我們每週 5 天,每天 24 小時在線上。
聊天
電子郵件
打電話給我