sealed (Référence C#)

Mise à jour : novembre 2007

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. Cela vous permet d'autoriser les classes à dériver de votre classe et de les empêcher de substituer des méthodes ou des propriétés virtuelles spécifiques.

Exemple

Dans l'exemple suivant, C hérite de B mais C ne peut pas substituer le fonction virtuelle F qui est déclarée dans A et sealed dans B.

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("X.F3"); }
}
class Z : Y
{
    // Attempting to override F causes compiler error CS0239.
    // protected override void F() { Console.WriteLine("C.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 virtual.

L'utilisation du modificateur abstract avec une classe sealed est une erreur. En effet, une classe abstraite doit être héritée d'une classe qui fournit une implémentation des méthodes ou propriétés abstraites.

Lorsqu'il s'applique à une méthode ou une propriété, le modificateur sealed doit toujours être utilisé avec override.

Comme les structs sont implicitement sealed, il est impossible d'en hériter.

Pour plus d'informations, consultez Héritage (Guide de programmation C#).

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

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

Dans l'exemple précédent, si vous tentez d'hériter de la classe sealed en utilisant une instruction telle que :

class MyDerivedC: SealedClass {} // Error

vous obtenez le message d'erreur :

'MyDerivedC' cannot inherit from sealed class 'SealedClass'.

Spécification du langage C#

Pour plus d'informations, consultez les sections suivantes dans Spécifications du langage C#.

  • 10.1.1.2 Classes sealed

  • 10.6.5 Méthodes sealed

Notes

Pour déterminer s'il faut sceller une classe, méthode ou propriété, vous devez généralement considérer les deux points suivants :

  • Les avantages potentiels dont les classes dérivées peuvent bénéficier en personnalisant votre classe.

  • La possibilité que les classes dérivées modifient vos classes et qu'elles ne fonctionnent plus correctement ni comme prévu.

Voir aussi

Concepts

Guide de programmation C#

Référence

Mots clés C#

Classes statiques et membres de classe statique (Guide de programmation C#)

Classes abstract et sealed et membres de classe (Guide de programmation C#)

Modificateurs d'accès (Guide de programmation C#)

Modificateurs (Référence C#)

override (Référence C#)

virtual (Référence C#)

Autres ressources

Référence C#