.NET 幫助

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

Chipego
奇佩戈·卡林达
2024年2月18日
分享:

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

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

密封類別:在 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 
{
}
Public NotInheritable Class Animal
	Public Property Species() As String
	Public Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog ' Error: Cannot be inherited
	Inherits Animal

End Class
$vbLabelText   $csharpLabel

與隱式封閉的結構不同,密封類必須使用如上所示的 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");
    }
}
Public Class Animal
	Public Property Species() As String
	Public Overridable Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
Public Class Dog
	Inherits Animal

	Public NotOverridable Overrides Sub MakeSound()
		Console.WriteLine("Generic animal sound")
	End Sub
End Class
$vbLabelText   $csharpLabel

虛擬(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 */ }
    }
}
Public NotInheritable Class ControlledClass
	Public NotOverridable Property ControlledProperty() As String
	Public Overridable NotOverridable Sub ControlledMethod()
		' Method implementation
	End Sub
	' Sealed event
	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)
		End Set
	End Property
End Class
$vbLabelText   $csharpLabel

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

密封類的基本原理

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

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

使用密封類的最佳實踐

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

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

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

  4. 使用密封方法以保持穩定性:當一個方法的核心行為應保持在不同子類別中穩定時,密封方法可能會帶來好處。 這可以增強程式碼的可預測性。

  5. 不能同時是抽象的:密封類/密封方法不能同時是抽象類/抽象方法,因為抽象類是設計用來被其他類繼承的,而密封類則限制繼承。

介紹 IronPDF

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

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

安裝

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

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");
    }
}
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
	' Sealed 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

		Public NotOverridable Overrides Sub MakeSound()
			Console.WriteLine("Generic animal sound")
		End Sub
		Public NotOverridable Overrides Sub Print()
			Dim pdfDocument = 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>"
	ignore ignore ignore ignore ignore ignore ignore ignore pdfDocument.RenderHtmlAsPdf(content).SaveAs("dog.pdf")
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

C# 密封類(對開發人員的工作原理):圖 3 - 主控台輸出,顯示執行命令和任何結果的主控台消息

以下是由 IronPDF 生成的 PDF

C# 密封類別(對開發人員的作用):圖 4 - 使用前述代碼範例生成的輸出 PDF

授權(免費試用可用)

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

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'"IronPdf.LicenseKey": "your license key"
$vbLabelText   $csharpLabel

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

結論

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

Chipego
奇佩戈·卡林达
軟體工程師
Chipego 擁有天生的傾聽技能,這幫助他理解客戶問題,並提供智能解決方案。他在獲得信息技術理學學士學位後,于 2023 年加入 Iron Software 團隊。IronPDF 和 IronOCR 是 Chipego 專注的兩個產品,但隨著他每天找到新的方法來支持客戶,他對所有產品的了解也在不斷增長。他喜歡在 Iron Software 的協作生活,公司內的團隊成員從各自不同的經歷中共同努力,創造出有效的創新解決方案。當 Chipego 離開辦公桌時,他常常享受讀好書或踢足球的樂趣。
< 上一頁
C# 優先佇列(開發者如何使用)
下一個 >
C# LINQ Join 查詢語法(對開發者的工作原理)