.NET 幫助

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

發佈 2024年2月18日
分享:

在物件導向程式設計的世界中,C# 語言為開發人員提供了一套多功能的工具以設計和實現穩健的軟體。其中一個為類別繼承增加額外控制層的功能是密封類別的概念。密封類別提供了一種獨特的方法來限制繼承層次結構,從而在某些情況下提供有益的安全性和封裝性。在本文中,我們將深入探討 C# 密封類別的複雜性,並且還將探討 IronPDF NuGet 套件來自 Iron Software.

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

密封類: 在C#中,密封類是一個不能被繼承的類。通過使用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#

虛擬關鍵字允許在衍生類別中重寫方法,而封閉關鍵字則防止在任何後續子類別中進一步重寫基類虛擬方法。

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

請考慮以下範例:

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. 谨慎使用密封类:虽然密封类具有优势,但应谨慎使用。过度使用密封类会导致代码变得僵化且难以维护。

  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 和密封類別

密封關鍵字和 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.10 剛剛發布

免費 NuGet 下載 總下載次數: 10,993,239 查看許可證 >