在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在物件導向程式設計的世界中,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
與隱式封閉的結構不同,密封類必須使用如上所示的 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
虛擬(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
在這個例子中,ControlledClass
的每一個方面都是密封的,包括屬性、方法、事件,甚至適用的話也包括索引子。 此級別的封裝提供了一種堅固不可更改的結構,非常適合需要保持類設計固定的情況。
程式碼安全性: 密封類透過防止未授權訪問和修改來增強程式碼安全性。 當一個類被封閉時,它作為一個具有明確定義界面和行為的封閉實體。 這種封裝減少了意外副作用或更改的風險,這些可能會潛在地危害代碼庫的穩定性和安全性。
設計完整性: 在較大的代碼庫或框架中,維持設計完整性是至關重要的。 密封類作為具有固定結構的基礎構建塊,減少了非預期修改的可能性。 這在一個類別作為系統核心組件的場景中特別有利,並且它的行為應在不同模塊中保持一致。
謹慎使用 Sealed 類別:雖然 sealed 類別具有優勢,但應該謹慎使用。 過度使用密封類可能導致代碼變得僵化且難以維護。
文件意圖:當封裝一個類或方法時,記錄此決策背後的意圖是至關重要的。 解釋為什麼特定類別是密封的,以及哪些設計考量導致了這個選擇。
考慮未來的可擴充性:在封裝類之前,請考慮未來的需求是否可能需要可擴充性。 如果某個類別有可能需要擴展,將其密封可能會阻礙未來的開發。
使用密封方法以保持穩定性:當方法的核心行為應在不同的子類別中保持穩定時,使用密封方法會很有幫助。 這可以增強程式碼的可預測性。
IronPDF是一個來自 的 C# PDF 庫Iron Software並且是一個現代的 PDF 生成器和閱讀器。
IronPDF 可以使用以下方法安裝:NuGet使用封裝管理器主控台或Visual Studio封裝管理器。 以下是控制台的命令:
dotnet add package IronPdf
或者,使用 NuGet 套件管理器安裝 IronPDF,在 NuGet 套件管理器的搜尋欄中搜尋「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
以下是由 IronPDF 生成的 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"
提供您的電子郵件以獲取試用許可證。
C# 密封類別為開發人員提供了一種強大的機制,以控制繼承層次結構,並確保某些類別及其成員無法被擴展或覆蓋。 雖然使用密封類應該謹慎考慮,但它們提供了封裝功能和防止意外修改的有效方法。 透過了解密封類別和方法的概念,開發者可以知曉何時及何地運用這種限制,進而有助於打造可維護、安全且可預測的軟體系統。 除了 IronPDF,我們還可以打印 PDF 文件。