.NET-HILFE

C# Sealed Class (Wie es für Entwickler funktioniert)

In der Welt der objektorientierten Programmierung bietet die Sprache C# Entwicklern ein vielseitiges Instrumentarium für den Entwurf und die Implementierung robuster Software. Eine solche Funktion, die der Klassenvererbung eine zusätzliche Kontrollebene hinzufügt, ist das Konzept der versiegelten Klasse. Versiegelte Klassen bieten eine einzigartige Möglichkeit, die Vererbungshierarchie einzuschränken, und bieten ein Maß an Sicherheit und Kapselung, das in bestimmten Szenarien von Vorteil sein kann. In diesem Artikel werden wir uns mit den Feinheiten der in C# versiegelten Klassen befassen und auch das IronPDF NuGet-Paket von Iron Software erkunden.

Was sind Sealed Classes und Sealed Methods?

Sealed-Klasse: In C# ist eine sealed-Klasse eine Klasse, die nicht vererbt werden kann. Mit dem Schlüsselwort sealed können Entwickler verhindern, dass andere Klassen von der versiegelten Klasse ableiten oder sie erweitern. Diese absichtliche Einschränkung stellt sicher, dass die versiegelte Klasse nicht als Basisklasse für eine andere Klasse verwendet werden kann, wodurch der Umfang der Vererbungshierarchie eingeschränkt wird. Versiegelte Klassen werden häufig verwendet, wenn ein Entwickler die Struktur einer Klasse kontrollieren und abschließen möchte, um unbeabsichtigte Änderungen durch Vererbung zu verhindern.

Betrachten Sie das folgende Beispiel:

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
$vbLabelText   $csharpLabel

Im Gegensatz zu Structs, die implizit versiegelt sind, muss die versiegelte Klasse wie oben gezeigt mit dem Schlüsselwort sealed deklariert werden. In diesem Beispiel wird die Klasse Animal als versiegelt deklariert, so dass es keiner anderen Klasse möglich ist, von ihr zu erben.

Versiegelte Methode: Zusätzlich zur Versiegelung ganzer Klassen ermöglicht C# Entwicklern auch, einzelne Methoden innerhalb einer Klasse zu versiegeln. Eine versiegelte Methode ist eine Methode, die von keiner abgeleiteten Klasse außer Kraft gesetzt werden kann. Dadurch wird sichergestellt, dass das Verhalten der Methode über alle Unterklassen hinweg konsistent bleibt, was der Anwendungslogik ein gewisses Maß an Vorhersehbarkeit verleiht.

Um eine Methode zu versiegeln, verwenden Sie den Modifikator 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
$vbLabelText   $csharpLabel

Mit dem Schlüsselwort virtual kann die Methode in abgeleiteten Klassen überschrieben werden, während das Schlüsselwort sealed verhindert, dass die virtuelle Methode der Basisklasse in nachfolgenden Unterklassen weiter überschrieben wird.

Versiegelte Klasse und Klassenmitglieder: Versiegelte Klassen können auch versiegelte Mitglieder umfassen, wie Eigenschaften, Methoden und Ereignisse. Diese Kombination aus versiegelter Klasse und versiegelten Mitgliedern gewährleistet ein hohes Maß an Kontrolle über das Verhalten und die Struktur der Klasse.

Betrachten Sie das folgende Beispiel:

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
$vbLabelText   $csharpLabel

In diesem Beispiel ist jeder Aspekt der ControlledClass versiegelt – die Eigenschaft, die Methode, das Ereignis und sogar ein Indexer, falls zutreffend. Dieses Maß an Versiegelung bietet eine robuste und unveränderliche Struktur, die sich ideal für Szenarien eignet, in denen das Design der Klasse fest bleiben soll.

Die Begründung für Sealed Class

Codesicherheit: Versiegelte Klassen tragen zur Codesicherheit bei, indem sie unautorisierten Zugriff und Modifikationen verhindern. Wenn eine Klasse versiegelt ist, dient sie als geschlossene Einheit mit einer genau definierten Schnittstelle und einem genau definierten Verhalten. Diese Kapselung minimiert das Risiko unbeabsichtigter Nebeneffekte oder Änderungen, die die Stabilität und Sicherheit der Codebasis gefährden könnten.

Design-Integrität: In größeren Codebasen oder Frameworks ist die Aufrechterhaltung der Design-Integrität von größter Bedeutung. Eine versiegelte Klasse fungiert als grundlegender Baustein mit festen Strukturen, wodurch die Gefahr unbeabsichtigter Änderungen verringert wird. Dies ist besonders in Szenarien von Vorteil, in denen eine Klasse als Kernkomponente eines Systems dient und ihr Verhalten über verschiedene Module hinweg konsistent bleiben soll.

Bewährte Praktiken für die Verwendung von Sealed Class

  1. Verwenden Sie die Sealed-Klasse sparsam: Obwohl die Sealed-Klasse Vorteile bietet, sollten sie mit Bedacht eingesetzt werden. Die übermäßige Verwendung von versiegelten Klassen kann zu starrem und weniger wartbarem Code führen.

  2. Dokumentenabsicht: Beim Versiegeln einer Klasse oder Methode ist es wichtig, die Absicht hinter dieser Entscheidung zu dokumentieren. Erläutern Sie, warum eine bestimmte Klasse versiegelt ist und welche gestalterischen Überlegungen zu dieser Wahl geführt haben.

  3. Betrachten Sie zukünftige Erweiterungsmöglichkeiten: Bevor Sie eine Klasse versiegeln, sollten Sie überlegen, ob zukünftige Anforderungen eine Erweiterbarkeit erfordern könnten. Wenn die Wahrscheinlichkeit besteht, dass eine Klasse erweitert werden muss, kann das Versiegeln der Klasse die zukünftige Entwicklung behindern.

  4. Verwenden Sie versiegelte Methoden für Stabilität: Das Versiegeln von Methoden kann von Vorteil sein, wenn das Kernverhalten einer Methode über verschiedene Unterklassen hinweg stabil bleiben soll. Dies kann die Vorhersagbarkeit des Codes verbessern.

  5. Es kann auch nicht abstrakt sein: Eine versiegelte Klasse/versiegelte Methoden können auch keine abstrakte Klasse/abstrakte Methoden sein, da abstrakte Klassen dazu entworfen sind, von anderen Klassen geerbt zu werden, während versiegelte Klassen die Vererbung einschränken.

Einführung in IronPDF

C#-versiegelte Klasse (Wie es für Entwickler funktioniert): Abbildung 1 - IronPDF-Webseite

IronPDF ist eine C#-PDF-Bibliothek von Iron Software und ist ein moderner PDF-Generator und -Reader.

Einrichtung

IronPDF kann mithilfe der NuGet-Paket-Manager-Konsole oder über den Visual Studio-Paket-Manager installiert werden. Nachfolgend finden Sie den Befehl für die Konsole:

dotnet add package IronPdf
dotnet add package IronPdf
SHELL

Sie können IronPDF auch über den NuGet Package Manager installieren, indem Sie in der Suchleiste des NuGet Package Managers nach "ironpdf" suchen.

C# Sealed Class (So funktioniert es für Entwickler): Abbildung 2 - Installation der IronPDF-Bibliothek über den NuGet-Paketmanager

IronPDF und versiegelte Klassen

Das Schlüsselwort sealed und IronPDF können zusammen verwendet werden, um zu verhindern, dass eine Unterklassenbibliothek oder eine abgeleitete Bibliothek geerbte Member überschreibt und PDFs erzeugt.

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
$vbLabelText   $csharpLabel

C# Sealed-Klasse (Wie sie für Entwickler funktioniert): Abbildung 3 - Konsolenausgabe, zeigt den Ausführungsbefehl und alle resultierenden Konsolennachrichten

Nachfolgend finden Sie die von IronPDF generierte PDF-Datei

C# Sealed-Klasse (Wie sie für Entwickler funktioniert): Abbildung 4 - Ausgegebenes PDF, das mit dem vorherigen Code-Beispiel erzeugt wurde

Lizenzierung (kostenlose Testversion verfügbar)

IronPDF. Dieser Schlüssel muss in appsettings.json platziert werden.

"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"
$vbLabelText   $csharpLabel

Geben Sie Ihre E-Mail-Adresse an, um eine Testlizenz zu erhalten.

Schlussfolgerung

C# versiegelte Klassen bieten Entwicklern einen leistungsfähigen Mechanismus, um die Vererbungshierarchie zu kontrollieren und sicherzustellen, dass bestimmte Klassen und ihre Mitglieder nicht erweitert oder überschrieben werden können. Die Verwendung von versiegelten Klassen sollte zwar sorgfältig abgewogen werden, doch bieten sie ein wirksames Mittel zur Kapselung von Funktionen und zur Verhinderung unbeabsichtigter Änderungen. Durch das Verständnis des Konzepts der versiegelten Klassen und Methoden können Entwickler fundierte Entscheidungen darüber treffen, wann und wo sie diese Einschränkung anwenden, und so zur Schaffung wartbarer, sicherer und vorhersehbarer Softwaresysteme beitragen. Zusammen mit IronPDF können wir auch PDF-Dokumente drucken.

Chipego
Software-Ingenieur
Chipego hat eine natürliche Fähigkeit zum Zuhören, die ihm hilft, Kundenprobleme zu verstehen und intelligente Lösungen anzubieten. Er trat dem Iron Software-Team 2023 bei, nachdem er einen Bachelor of Science in Informationstechnologie erworben hatte. IronPDF und IronOCR sind die beiden Produkte, auf die sich Chipego konzentriert hat, aber sein Wissen über alle Produkte wächst täglich, da er neue Wege findet, Kunden zu unterstützen. Er genießt die Zusammenarbeit bei Iron Software, da Teammitglieder aus dem gesamten Unternehmen ihre unterschiedlichen Erfahrungen einbringen und so zu effektiven, innovativen Lösungen beitragen. Wenn Chipego nicht an seinem Schreibtisch sitzt, kann man ihn oft bei einem guten Buch oder beim Fußballspielen antreffen.
< PREVIOUS
C# Prioritäts-Warteschlange (So funktioniert es für Entwickler)
NÄCHSTES >
C# LINQ Join Query Syntax (Wie es für Entwickler funktioniert)