AIDE .NET

Classe scellée C# (Comment ça marche pour les développeurs)

Publié février 18, 2024
Partager:

Dans le monde de la programmation orientée objet, le langage C# offre aux développeurs un ensemble d'outils polyvalents pour concevoir et mettre en œuvre des logiciels robustes. L'une de ces caractéristiques, qui ajoute une couche de contrôle supplémentaire à l'héritage des classes, est le concept de classe scellée. Les classes scellées offrent un moyen unique de restreindre la hiérarchie de l'héritage, en fournissant un niveau de sécurité et d'encapsulation qui peut être bénéfique dans certains scénarios. Dans cet article, nous allons nous plonger dans les subtilités des classes scellées de C#, et nous explorerons également la fonctionIronPDF Paquet NuGet deIron Software.

Qu'est-ce qu'une classe scellée et une méthode scellée ?

Sealed Class: En C#, une classe scellée est une classe qui ne peut pas être héritée. En utilisant le mot-clé sealed, les développeurs peuvent empêcher d'autres classes de dériver ou d'étendre la classe sealed. Cette restriction délibérée garantit que la classe scellée ne peut pas être utilisée comme classe de base pour une autre classe, ce qui limite la portée de la hiérarchie de l'héritage. Les classes scellées sont souvent utilisées lorsqu'un développeur souhaite contrôler et finaliser la structure d'une classe, afin d'éviter des modifications involontaires par le biais de l'héritage.

Prenons l'exemple suivant :

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
VB   C#

Contrairement aux structures qui sont implicitement scellées, la classe scellée doit être déclarée à l'aide du mot-clé sealed, comme indiqué ci-dessus. Dans cet exemple, la classe Animal est déclarée comme scellée, ce qui empêche toute autre classe d'en hériter.

Méthode scellée: En plus de sceller des classes entières, C# permet également aux développeurs de sceller des méthodes individuelles au sein d'une classe. Une méthode scellée est une méthode qu'aucune classe dérivée ne peut remplacer. Cela garantit que le comportement de la méthode reste cohérent dans toutes les sous-classes, offrant ainsi un niveau de prévisibilité dans la logique de l'application.

Pour sceller une méthode, utilisez le modificateur 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
VB   C#

Le mot-clé virtual permet à la méthode d'être surchargée dans les classes dérivées, tandis que le mot-clé sealed empêche la surcharge de la méthode virtuelle de la classe de base dans toutes les sous-classes suivantes.

Classe scellée et membres de la classe : Les classes scellées peuvent également inclure des membres scellés, tels que des propriétés, des méthodes et des événements. Cette combinaison de classe scellée et de membres scellés garantit un haut degré de contrôle sur le comportement et la structure de la classe.

Prenons l'exemple suivant :

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
VB   C#

Dans cet exemple, chaque aspect de la ClasseContrôlée est scellé - la propriété, la méthode, l'événement, et même un indexeur le cas échéant. Ce niveau d'étanchéité permet d'obtenir une structure robuste et inaltérable, idéale pour les scénarios dans lesquels la conception de la classe doit rester fixe.

La raison d'être de la classe scellée

Sécurité du code: Les classes scellées contribuent à la sécurité du code en empêchant les accès et les modifications non autorisés. Lorsqu'une classe est scellée, elle sert d'entité fermée avec une interface et un comportement bien définis. Cette encapsulation minimise le risque d'effets secondaires involontaires ou d'altérations susceptibles de compromettre la stabilité et la sécurité de la base de code.

Intégrité de la conception: Dans les bases de code ou les cadres plus importants, le maintien de l'intégrité de la conception est primordial. Une classe scellée agit comme un bloc de construction fondamental avec des structures fixes, ce qui réduit les risques de modifications involontaires. Ceci est particulièrement utile dans les scénarios où une classe sert de composant central d'un système et où son comportement doit rester cohérent dans les différents modules.

Bonnes pratiques pour l'utilisation de la classe scellée

  1. Utiliser la classe scellée avec parcimonie : Bien que la classe scellée présente des avantages, elle doit être utilisée judicieusement. L'utilisation excessive de classes scellées peut conduire à un code rigide et moins facile à maintenir.

  2. Documenter l'intention : Lorsque l'on scelle une classe ou une méthode, il est essentiel de documenter l'intention qui sous-tend cette décision. Expliquez pourquoi une classe particulière est scellée et quelles sont les considérations de conception qui ont conduit à ce choix.

  3. Considérer l'extensibilité future : Avant de sceller une classe, il convient de se demander si des exigences futures pourraient nécessiter une extensibilité. S'il est probable qu'une classe doive être étendue, le fait de la sceller peut entraver le développement futur.

  4. Utiliser des méthodes scellées pour la stabilité : Les méthodes scellées peuvent être utiles lorsque le comportement de base d'une méthode doit rester stable dans différentes sous-classes. Cela peut améliorer la prévisibilité du code.

  5. Il ne peut pas être également abstrait: Une classe de scellement/des méthodes de scellement ne peut pas être également une classe abstraite/des méthodes abstraites car les classes abstraites sont conçues pour être héritées par d'autres classes alors que les "classes scellées" restreignent l'héritage.

Présentation d'IronPDF

Classe scellée C# (Comment ça marche pour les développeurs) : Figure 1 - Page web d'IronPDF

IronPDF est une bibliothèque PDF C# deIron Software et est un générateur et un lecteur de PDF moderne.

Installation

IronPDF peut être installé à l'aide de la commandeNuGet Ou en utilisant le gestionnaire de paquets de Visual Studio. Voici la commande pour la console :

dotnet add package IronPdf

Ou, pour installer IronPDF à l'aide de NuGet Package Manager, recherchez "ironpdf" dans la barre de recherche de NuGet Package Manager.

Classe scellée C# (Comment ça marche pour les développeurs) : Figure 2 - Installation de la bibliothèque IronPDF via le gestionnaire de paquets NuGet

IronPDF et les classes scellées

Ensemble, le mot-clé sealed et IronPDF peuvent être utilisés pour empêcher une bibliothèque de sous-classe ou une bibliothèque dérivée de surcharger les membres hérités et de générer des 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
VB   C#

Classe scellée C# (Comment ça marche pour les développeurs) : Figure 3 - Sortie de la console, montrant la commande d'exécution et tous les messages de la console qui en résultent

Voici le PDF généré par IronPDF

Classe scellée C# (Comment ça marche pour les développeurs) : Figure 4 - PDF généré avec l'exemple de code précédent

Licence (essai gratuit disponible)

IronPDF. Cette clé doit être placée dans 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"
VB   C#

Indiquez votre adresse électronique pour obtenir une licence d'essai.

Conclusion

Les classes scellées C# offrent aux développeurs un mécanisme puissant pour contrôler la hiérarchie de l'héritage et garantir que certaines classes et leurs membres ne peuvent pas être étendus ou remplacés. Bien que l'utilisation de classes scellées doive être mûrement réfléchie, elles constituent un moyen efficace d'encapsuler les fonctionnalités et d'empêcher les modifications involontaires. En comprenant le concept de classes et de méthodes scellées, les développeurs peuvent prendre des décisions éclairées sur le moment et l'endroit où appliquer cette restriction, contribuant ainsi à créer des systèmes logiciels faciles à maintenir, sûrs et prévisibles. Avec IronPDF, nous pouvons également imprimer des documents PDF.

< PRÉCÉDENT
File d'attente prioritaire en C# (Comment ça marche pour les développeurs)
SUIVANT >
Syntaxe des requêtes jointes LINQ en C# (Comment ça marche pour les développeurs)