.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 
{
}
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
VB   C#

與隱式封閉的結構不同,密封類必須使用如上所示的 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
VB   C#

虛擬(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
VB   C#

在這個例子中,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");
    }
}
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
VB   C#

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"
VB   C#

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

結論

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

< 上一頁
C# 優先佇列(開發者如何使用)
下一個 >
C# LINQ Join 查詢語法(對開發者的工作原理)

準備開始了嗎? 版本: 2024.12 剛剛發布

免費 NuGet 下載 總下載次數: 11,622,374 查看許可證 >