在實際環境中測試
在生產環境中測試無浮水印。
在任何需要的地方都能運作。
在物件導向程式設計的世界中,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
與隱式密封的結構不同,必須使用 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
虛擬關鍵字允許在衍生類別中重寫方法,而封閉關鍵字則防止在任何後續子類別中進一步重寫基類虛擬方法。
密封類別與類別成員:密封類別也可以包含密封成員,例如屬性、方法和事件。這種密封類別和密封成員的結合確保了對該類別行為和結構的高度控制。
請考慮以下範例:
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
的每個方面都被封裝了——屬性、方法、事件,甚至索引器(如果適用)。這種封裝級別提供了強健且不可更改的結構,非常適合類別設計應保持固定的情境。
代碼安全性: 密封類通過防止未經授權的訪問和修改來增強代碼安全性。當一個類被密封時,它作為一個封閉的實體具有明確定義的介面和行為。這種封裝模式可以最大限度地減少不必要的副作用或變更,從而潛在地保障代碼庫的穩定性和安全性。
設計完整性: 在較大的代碼庫或框架中,保持設計完整性至關重要。密封類作為具有固定結構的基礎構件,減少了不必要的修改機會。這在某些情況下尤其有利,例如當某個類作為系統的核心組件時,其行為應在不同模組之間保持一致。
谨慎使用密封类:虽然密封类具有优势,但应谨慎使用。过度使用密封类会导致代码变得僵化且难以维护。
记录意图:在密封一个类或方法时,记录此决定背后的意图是至关重要的。解释为什么某个类是密封的,以及哪些设计考虑导致了这种选择。
考虑未来的可扩展性:在密封一个类之前,考虑未来的需求是否可能需要扩展性。如果有可能需要扩展某个类,密封它可能会阻碍未来的发展。
使用密封方法以稳定性:当方法的核心行为需要在不同子类中保持稳定时,密封方法是有益的。这可以增强代码的可预测性。
IronPDF 是一個來自 的 C# PDF 庫 Iron Software 並且是一個現代的 PDF 生成器和閱讀器。
IronPDF 可以使用 NuGet 在套件管理器控制台或使用 Visual Studio 套件管理器。以下是控制台的指令:
dotnet add package IronPdf
或者,使用 NuGet 套件管理器來安裝 IronPDF,請在 NuGet 套件管理器的搜尋欄中搜索 "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
以下是由 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 文件。