C# 密封類 (對開發者如何運作)
在物件導向程式設計的世界裡,C# 語言為開發人員提供了一套多樣化的工具來設計和實作穩健的軟體。 其中一個為類別繼承增加額外控制層的功能是封閉類的概念。 封閉類別提供了一種限制繼承階層的獨特方式,提供了在某些情況下有利的安全性與封閉性。 在本文中,我們將深入探討 C# sealed 類別的複雜性,同時也會探討 IronPDF 來自 Iron Software 的 NuGet 套件。
什麼是封閉類和封閉方法?
封閉類別:在 C# 中,封閉類別是一個無法繼承的類別。 透過使用 sealed 關鍵字,開發人員可以防止其他類別從 sealed class 派生或延伸。 這種刻意的限制可確保封閉類無法用作任何其他類別的基類,限制了繼承階層的範圍。 當開發人員想要控制並確定類的結構,防止透過繼承進行意外修改時,通常會使用封閉類。
請考慮以下範例:
public sealed class Animal
{
public string Species { get; set; }
public void MakeSound()
{
Console.WriteLine("Generic animal sound");
}
}
// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }public sealed class Animal
{
public string Species { get; set; }
public void MakeSound()
{
Console.WriteLine("Generic animal sound");
}
}
// The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
// public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
// {
// }Public NotInheritable Class Animal
Public Property Species() As String
Public Sub MakeSound()
Console.WriteLine("Generic animal sound")
End Sub
End Class
' The following code will cause a compilation error because 'Animal' is sealed and cannot be inherited:
' public class Dog : Animal // Error: Cannot inherit from sealed class 'Animal'
' {
' }與隱含 sealed 的 struct 不同,sealed 類必須使用 sealed 關鍵字來宣告,如上圖所示。 在這個範例中,Animal 類宣告為 sealed,使得任何其他的類別無法繼承自它。
封閉方法:除了封閉整個類別之外,C# 也允許開發人員封閉類別中的個別方法。 密封方法是一種任何衍生類別都無法覆寫的方法。這可確保方法的行為在所有子類中保持一致,為應用程式的邏輯提供一定程度的可預測性。
若要封存方法,請使用 sealed 修改器:
public class Animal
{
public string Species { get; set; }
// A virtual method allows derived classes to override it.
public virtual void MakeSound()
{
Console.WriteLine("Generic animal sound");
}
}
public class Dog : Animal
{
// The sealed override prevents further overriding of this method.
public sealed override void MakeSound()
{
Console.WriteLine("Bark!");
}
}public class Animal
{
public string Species { get; set; }
// A virtual method allows derived classes to override it.
public virtual void MakeSound()
{
Console.WriteLine("Generic animal sound");
}
}
public class Dog : Animal
{
// The sealed override prevents further overriding of this method.
public sealed override void MakeSound()
{
Console.WriteLine("Bark!");
}
}Public Class Animal
Public Property Species() As String
' A virtual method allows derived classes to override it.
Public Overridable Sub MakeSound()
Console.WriteLine("Generic animal sound")
End Sub
End Class
Public Class Dog
Inherits Animal
' The sealed override prevents further overriding of this method.
Public NotOverridable Overrides Sub MakeSound()
Console.WriteLine("Bark!")
End Sub
End Classvirtual 關鍵字允許在派生類中覆寫方法,而 sealed 關鍵字則可防止在任何後續的子類中進一步覆寫基類虛擬方法。
封閉的類別和類別成員:封閉的類別也可以包含封閉的成員,例如屬性、方法和事件。 這種封閉類和封閉成員的組合可確保對類的行為和結構的高度控制。
請考慮以下範例:
public sealed class ControlledClass
{
// A sealed property that prevents overriding.
public sealed string ControlledProperty { get; set; }
// A method that cannot be redefined by derived classes.
public virtual sealed void ControlledMethod()
{
// Method implementation
Console.WriteLine("Executing controlled method.");
}
// A sealed event that cannot be subscribed to or raised by derived classes.
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
{
// A sealed property that prevents overriding.
public sealed string ControlledProperty { get; set; }
// A method that cannot be redefined by derived classes.
public virtual sealed void ControlledMethod()
{
// Method implementation
Console.WriteLine("Executing controlled method.");
}
// A sealed event that cannot be subscribed to or raised by derived classes.
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
' A sealed property that prevents overriding.
Public NotOverridable Property ControlledProperty() As String
' A method that cannot be redefined by derived classes.
Public Overridable NotOverridable Sub ControlledMethod()
' Method implementation
Console.WriteLine("Executing controlled method.")
End Sub
' A sealed event that cannot be subscribed to or raised by derived classes.
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)
' Setter implementation
End Set
End Property
End Class在這個範例中,ControlledClass 的每個層面都被封存 - 屬性、方法、事件,甚至是索引器 (如果適用)。 此層級的密封性提供了堅固且不可篡改的結構,非常適合類型設計應保持固定的情況。
封閉類別背後的理念
程式碼安全性:封閉的類別可防止未經授權的存取和修改,有助於程式碼的安全性。 當一個類別被封存時,它就成為一個封閉的實體,具有明確定義的介面和行為。 這種封裝方式可將可能危及程式碼庫穩定性與安全性的意外副作用或變更風險降至最低。
設計完整性:在較大的程式碼庫或框架中,保持設計完整性是最重要的。 封閉類是具有固定結構的基礎建構區塊,可降低意外修改的機會。 這對於類別作為系統核心元件,且其行為應在不同模組間保持一致的情況特別有利。
使用封閉類的最佳實務
1.慎用密封類別:儘管密封類別提供了許多好處,但應審慎使用。 過度使用密封類別會導致程式碼僵化且不易維護。 2.記錄意圖:在封存類別或方法時,記錄此決定背後的意圖是至關重要的。 解釋為何要封存特定的類別,以及導致該選擇的設計考量。 3.考慮未來的擴充性:在封存類別之前,請考慮未來的需求是否需要擴充性。 如果有可能需要擴充某個類別,封閉它可能會妨礙未來的發展。 4.使用封閉方法來保持穩定性:當一個方法的核心行為應該在不同的子類中保持穩定時,封閉方法是有益的。 這可以增強程式碼的可預測性。 5.It Cannot Also be Abstract:封閉的類別/封閉的方法不能同時也是抽象的類別/抽象的方法,因為抽象的類別是設計給其他類別繼承的,而封閉的類別則限制繼承。
介紹 IronPDF。

IronPDF 是來自 Iron Software 的 C# PDF 函式庫,是現代化的 PDF 產生器和閱讀器。
安裝
IronPdf 可使用 NuGet 套件管理員控制台或 Visual Studio 套件管理員進行安裝。 以下是控制台的指令:
Install-Package IronPdf
或使用 NuGet Package Manager 安裝 IronPDF,請在 NuGet Package Manager 的搜尋列中搜尋"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();
}
}
// 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
{
// Sealed override ensures method cannot be overridden in further derived classes.
public sealed override void MakeSound()
{
Console.WriteLine("Bark!");
}
public sealed override void Print()
{
var pdfRenderer = 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>";
pdfRenderer.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();
}
}
// 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
{
// Sealed override ensures method cannot be overridden in further derived classes.
public sealed override void MakeSound()
{
Console.WriteLine("Bark!");
}
public sealed override void Print()
{
var pdfRenderer = 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>";
pdfRenderer.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
' 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
' Sealed override ensures method cannot be overridden in further derived classes.
Public NotOverridable Overrides Sub MakeSound()
Console.WriteLine("Bark!")
End Sub
Public NotOverridable Overrides Sub Print()
Dim pdfRenderer = 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>"
pdfRenderer.RenderHtmlAsPdf(content).SaveAs("dog.pdf")
End Sub
End Class
End Namespace
。
以下是 IronPDF 生成的 PDF
。
授權(可免費試用)
IronPDF. 此 key 需要放在 appsettings.json 中。
{
"IronPdf.LicenseKey": "your license key"
}提供您的電子郵件以取得試用授權。
結論
C# 密封類別為開發人員提供了強大的機制來控制繼承階層,並確保某些類別及其成員無法擴充或覆寫。 儘管應該謹慎考量密封類別的使用,但它們提供了一種有效的方式來封裝功能並防止意外修改。 藉由瞭解封閉類和方法的概念,開發人員可以就何時何地應用此限制做出明智的決策,有助於建立可維護、安全且可預測的軟體系統。 配合 IronPDF,我們還可以列印 PDF 文件。
常見問題解答
C# 中的 sealed class 如何運作?
在 C# 中,使用 sealed 關鍵字定義封閉類。這可以防止其他類別繼承自該類別,確保該類別的實作保持不變。
開發人員為何要在 C# 中使用密封類別?
封閉類別是用來防止繼承,以維持程式碼的完整性。這可確保類的行為保持一致且安全,尤其是在設計完整性極為重要的大型系統中。
密封的類別是否也可以擁有密封的方法?
是的,密封類別可以包含本身為密封的方法。這表示這些方法無法在派生類中被覆蓋,進一步加強了類別功能的安全性和一致性。
在類別中使用 sealed 方法有什麼好處?
封閉方法可防止衍生類別覆寫,這有助於維持方法的原始行為,確保一致性並防止意外修改。
您能提供何時使用密封類別的範例嗎?
當您想要鎖定一個類別的實作以防止透過繼承產生變更時,例如在公用程式類別中,或是在處理需要穩定性的敏感作業時,封閉類別就非常有用。
密封類別與 C# 中的 PDF 生成有何關聯?
在使用 IronPDF 之類的 PDF 函式庫時,可以利用封閉的類別,透過繼承來防止修改,以確保 PDF 生成流程保持一致且安全。
是否可以將封閉類與 IronPDF 等第三方函式庫一起使用?
是的,密封類別可與 IronPDF 等第三方函式庫一起使用,將 PDF 生成邏輯封裝在安全、不可繼承的類別結構中。
如何使用 NuGet 安裝 C# PDF 函式庫?
您可以使用 dotnet add package IronPdf 指令或在 Visual Studio NuGet Package Manager 中搜尋「ironpdf」,透過 NuGet Package Manager 安裝 C# PDF 函式庫,例如 IronPDF。
在軟體設計中使用密封類別有哪些注意事項?
開發人員應考慮未來擴充性的需求,並記錄封存類別的原因。使用封閉類可以增強安全性和可維護性,但應平衡應用程式所需的靈活性。
有什麼值得推薦的 C# 開發人員 PDF 生成器?
IronPDF 是 C# 開發人員推薦的 PDF 產生器,以 NuGet 套件的形式提供強大的 PDF 建立與操作功能。







