Passer au contenu du pied de page
.NET AIDE

C# Sealed Class (Comment ça fonctionne pour les développeurs)

Dans le monde de la programmation orientée objet, le langage C# fournit aux développeurs un ensemble d'outils polyvalents pour concevoir et mettre en œuvre des logiciels robustes. L'une de ces fonctionnalités qui ajoute un niveau supplémentaire de contrôle à l'héritage de classe est le concept de classe scellée. Les classes scellées offrent une manière unique de restreindre la hiérarchie d'héritage, offrant un niveau de sécurité et d'encapsulation qui peut être bénéfique dans certains scénarios. In this article, we will delve into the intricacies of the C# sealed classes and also explore the IronPDF NuGet package from Iron Software.

Qu'est-ce que les Classes Scellées et les Méthodes Scellées ?

Classe Scellée : 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 de s'étendre à partir de la classe scellée. Cette restriction délibérée garantit que la classe scellée ne peut pas être utilisée comme classe de base pour toute autre classe, limitant l'étendue de la hiérarchie d'héritage. Les classes scellées sont souvent employées lorsqu'un développeur souhaite contrôler et finaliser la structure d'une classe, empêchant ainsi les modifications involontaires par héritage.

Considérez l'exemple suivant :

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'
' {
' }
$vbLabelText   $csharpLabel

Contrairement aux structs, qui sont implicitement scellés, la classe scellée doit être déclarée en utilisant le mot-clé sealed comme montré ci-dessus. Dans cet exemple, la classe Animal est déclarée comme scellée, ce qui rend impossible son héritage par toute autre classe.

Méthode Scellée : En plus de sceller des classes entières, C# permet également aux développeurs de sceller des méthodes individuelles dans une classe. Une méthode scellée est une méthode que toute classe dérivée ne peut pas remplacer. Cela garantit que le comportement de la méthode reste cohérent dans toutes les sous-classes, offrant 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; }

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

Le mot-clé virtual permet que la méthode soit remplacée dans les classes dérivées, tandis que le mot-clé sealed empêche que la méthode virtuelle de la classe de base soit remplacée dans d'éventuelles sous-classes ultérieures.

Classe Scellée et Membres de Classe : Les classes scellées peuvent également inclure des membres scellés, tels que des propriétés, méthodes et é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.

Considérez l'exemple suivant :

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

Dans cet exemple, chaque aspect de la ControlledClass est scellé – la propriété, la méthode, l'événement, et même un indexeur si applicable. Ce niveau de scellement fournit une structure robuste et inaltérable, idéale pour les scénarios où 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 l'accès et la modification 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 ou de modifications involontaires qui pourraient potentiellement compromettre la stabilité et la sécurité de la base de code.

Intégrité de la Conception : Dans les grandes bases de code ou les frameworks, maintenir l'intégrité de la conception est primordial. Une classe scellée agit comme un bloc de construction fondamental avec des structures fixes, réduisant les chances de modifications involontaires. Cela est particulièrement bénéfique dans les scénarios où une classe sert de composant central d'un système, et son comportement doit rester cohérent entre 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 offre des avantages, elle doit être employée judicieusement. Une utilisation excessive de classes scellées peut conduire à un code rigide et moins maintenable.
  2. Documenter l'Intention : Lorsque vous scellez une classe ou une méthode, il est crucial de documenter l'intention derrière cette décision. Expliquez pourquoi une classe particulière est scellée et quelles considérations de conception ont conduit à ce choix.
  3. Considérer l'Extensibilité Future : Avant de sceller une classe, envisagez si des exigences futures pourraient nécessiter de l'extensibilité. S'il est probable qu'une classe doive être étendue, la sceller peut entraver le développement futur.
  4. Utiliser des Méthodes Scellées pour la Stabilité : Sceller des méthodes peut être bénéfique lorsque le comportement de base d'une méthode doit rester stable à travers différentes sous-classes. Cela peut améliorer la prévisibilité du code.
  5. Elle ne Peut Aussi Être Abstraite : Une classe/méthode scellée ne peut pas non plus être une classe/méthode abstraite car les classes abstraites sont conçues pour être héritées par d'autres classes tandis que les classes scellées restreignent l'héritage.

Présentation d'IronPDF

Classe Scellée en C# (Comment Cela Fonctionne pour les Développeurs) : Figure 1 - page web IronPDF

IronPDF is a C# PDF library from Iron Software et est un générateur et lecteur PDF moderne.

Installation

IronPDF peut être installé en utilisant la console du Gestionnaire de Paquets NuGet ou en utilisant le gestionnaire de paquets de Visual Studio. Ci-dessous est la commande pour la console :

Install-Package IronPdf

Ou, pour installer IronPDF via le Gestionnaire de Paquets NuGet, recherchez "ironpdf" dans la barre de recherche du Gestionnaire de Paquets NuGet.

Classe Scellée en C# (Comment Cela Fonctionne pour les Développeurs) : Figure 2 - Installation de la bibliothèque IronPDF par 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 remplacer les membres hérités et aussi de générer des PDFs.

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

Classe Scellée en C# (Comment Cela Fonctionne pour les Développeurs) : Figure 3 - Sortie de la console, montrant la commande d'exécution et tout message de la console résultant

Ci-dessous est le PDF généré par IronPDF

Classe Scellée en C# (Comment Cela Fonctionne 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"
}

Fournissez votre email pour obtenir une licence d'essai.

Conclusion

Les classes scellées en C# offrent aux développeurs un mécanisme puissant pour contrôler la hiérarchie d'héritage et garantir que certaines classes et leurs membres ne peuvent pas être étendus ou surchargés. Bien que l'utilisation des classes scellées doive être soigneusement considérée, elles fournissent un moyen efficace d'encapsuler la fonctionnalité et d'éviter les modifications involontaires. En comprenant le concept de classes et méthodes scellées, les développeurs peuvent prendre des décisions éclairées sur le moment et l'endroit pour appliquer cette restriction, contribuant à créer des systèmes logiciels maintenables, sécurisés et prévisibles. Avec IronPDF, nous pouvons également imprimer des documents PDF.

Questions Fréquemment Posées

Comment fonctionne une classe scellée en C#?

En C#, une classe scellée est définie à l'aide du mot-clé sealed. Cela empêche d'autres classes d'en hériter, garantissant que l'implémentation de la classe reste inchangée.

Pourquoi les développeurs devraient-ils utiliser des classes scellées en C#?

Les classes scellées sont utilisées pour maintenir l'intégrité du code en empêchant l'héritage. Cela garantit que le comportement de la classe reste cohérent et sécurisé, notamment dans les systèmes plus grands où l'intégrité du design est cruciale.

Les classes scellées peuvent-elles avoir des méthodes également scellées?

Oui, les classes scellées peuvent contenir des méthodes qui sont elles-mêmes scellées. Cela signifie que les méthodes ne peuvent pas être remplacées dans les classes dérivées, renforçant encore la sécurité et la cohérence de la fonctionnalité de la classe.

Quel est l'avantage d'utiliser des méthodes scellées dans une classe?

Les méthodes scellées empêchent le remplacement par des classes dérivées, ce qui aide à maintenir le comportement original de la méthode, garantissant la cohérence et protégeant contre les modifications non intentionnelles.

Pouvez-vous fournir des exemples de quand utiliser des classes scellées?

Les classes scellées sont utiles lorsque vous souhaitez verrouiller l'implémentation d'une classe pour éviter les modifications par l'héritage, comme dans les classes utilitaires ou lors du travail avec des opérations sensibles où la stabilité est requise.

Comment les classes scellées sont-elles liées à la génération de PDF en C#?

Lors de l'utilisation d'une bibliothèque PDF comme IronPDF, les classes scellées peuvent être exploitées pour garantir que les processus de génération de PDF restent cohérents et sécurisés, en empêchant les modifications par l'héritage.

Est-il possible d'utiliser des classes scellées avec des bibliothèques tierces comme IronPDF?

Oui, les classes scellées peuvent être utilisées parallèlement à des bibliothèques tierces comme IronPDF pour encapsuler la logique de génération de PDF au sein d'une structure de classe sécurisée et non héritée.

Comment puis-je installer une bibliothèque PDF C# à l'aide de NuGet?

Vous pouvez installer une bibliothèque PDF C#, telle qu'IronPDF, via le gestionnaire de packages NuGet en utilisant la commande dotnet add package IronPdf ou en recherchant 'ironpdf' dans le gestionnaire de packages NuGet de Visual Studio.

Quelles sont les considérations pour utiliser des classes scellées dans la conception logicielle?

Les développeurs doivent considérer le besoin d'extensibilité future et documenter les raisons pour lesquelles une classe est scellée. L'utilisation des classes scellées peut améliorer la sécurité et la maintenabilité mais doit être équilibrée avec la flexibilité requise par l'application.

Quel est un générateur de PDF recommandé pour les développeurs C#?

IronPDF est un générateur de PDF recommandé pour les développeurs C#, fournissant des capacités de création et de manipulation de PDF robustes en tant que package NuGet.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite