在实际环境中测试
在生产中测试无水印。
随时随地为您服务。
在面向对象编程的世界中,C#语言为开发人员提供了一套多功能工具,用于设计和实施稳健的软件。 其中一种能够为类继承增加额外控制层的功能是密封类的概念。 密封类提供了一种独特的方法来限制继承层次结构,提供了在某些情况下有利的安全性和封装级别。 在本文中,我们将深入探讨 C# 密封类的复杂性,并且还将探索IronPDF的 NuGet 软件包铁软件.
密封类: 在 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
虚拟关键字允许方法在派生类中被重写,而密封关键字则防止在任何后续子类中进一步重写基类的虚拟方法。
密封类及类成员:密封类也可以包含密封成员,如属性、方法和事件。 这种密封类和密封成员的组合确保了对类的行为和结构的高度控制。
考虑以下示例:
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是一个来自铁软件是一款现代 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文档。