sealed (référence C#)

Lorsqu’il est appliqué à une classe, le modificateur sealed empêche les autres classes d’en hériter. Dans l’exemple suivant, la classe B hérite de la classe A, mais aucune classe ne peut hériter de la classe B.

class A {}
sealed class B : A {}

Vous pouvez également utiliser le modificateur sealed sur une méthode ou une propriété qui substitue une méthode ou une propriété virtuelle dans une classe de base. Ainsi, vous pouvez autoriser les classes à dériver de votre classe et les empêcher de substituer des méthodes ou des propriétés virtuelles spécifiques.

Exemple

Dans l’exemple suivant, Z hérite de Y mais Z ne peut pas substituer la fonction virtuelle F qui est déclarée dans X et scellée (sealed) dans Y.

class X
{
    protected virtual void F() { Console.WriteLine("X.F"); }
    protected virtual void F2() { Console.WriteLine("X.F2"); }
}

class Y : X
{
    sealed protected override void F() { Console.WriteLine("Y.F"); }
    protected override void F2() { Console.WriteLine("Y.F2"); }
}

class Z : Y
{
    // Attempting to override F causes compiler error CS0239.
    // protected override void F() { Console.WriteLine("Z.F"); }

    // Overriding F2 is allowed.
    protected override void F2() { Console.WriteLine("Z.F2"); }
}

Lorsque vous définissez de nouvelles méthodes ou propriétés dans une classe, vous pouvez empêcher les classes dérivées de les substituer en ne les déclarant pas comme virtuelles.

Une erreur consiste à utiliser le modificateur abstract avec une classe sealed, car une classe abstraite doit être héritée par une classe qui fournit une implémentation des méthodes ou des propriétés abstraites.

Lorsqu’il est appliqué à une méthode ou une propriété, le modificateur sealed doit toujours être utilisé avec sealed.

Comme les structs sont implicitement sealed, ils ne peuvent pas être hérités.

Pour plus d’informations, consultez Héritage.

Pour plus d’exemples, consultez Classes abstract et sealed et membres de classe.

sealed class SealedClass
{
    public int x;
    public int y;
}

class SealedTest2
{
    static void Main()
    {
        var sc = new SealedClass();
        sc.x = 110;
        sc.y = 150;
        Console.WriteLine($"x = {sc.x}, y = {sc.y}");
    }
}
// Output: x = 110, y = 150

Dans l’exemple précédent, vous pouvez essayer d’hériter de la classe sealed à l’aide de l’instruction suivante :

class MyDerivedC: SealedClass {} // Error

Le résultat est un message d’erreur :

'MyDerivedC': cannot derive from sealed type 'SealedClass'

Remarques

Pour déterminer s’il faut sceller une classe, une méthode ou une propriété, vous devez généralement prendre en compte les deux points suivants :

  • Les avantages potentiels dont les classes dérivées peuvent bénéficier grâce à la possibilité de personnaliser votre classe.

  • Le risque que les classes dérivées puissent modifier vos classes de telle manière qu’elles ne fonctionnent plus correctement ou comme prévu.

spécification du langage C#

Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.

Voir aussi