sealed (Riferimenti per C#)

Aggiornamento: novembre 2007

Quando viene applicato a una classe, il modificatore sealed impedisce ad altre classi di ereditare da tale classe. Nell'esempio riportato di seguito, la classe B eredita dalla classe A, ma nessuna classe può ereditare dalla classe B.

    class A {}    
    sealed class B : A {}

È anche possibile utilizzare il modificatore sealed su un metodo o una proprietà che esegue l'override di un metodo o una proprietà virtuale in una classe di base. In questo modo è possibile consentire alle classi di derivare dalla classe in questione pur impedendone l'override di metodi o proprietà virtuali.

Esempio

Nell'esempio riportato di seguito, C eredita da B ma C non può eseguire l'override della funzione virtuale F dichiarata in A e contrassegnata come sealed in 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"); }
}

Quando si definiscono metodi o proprietà nuove in una classe, è possibile impedire alle classi derivate di eseguire l'override non dichiarandole virtual.

L'utilizzo del modificatore abstract con una classe sealed è un errore, in quanto una classe abstract deve essere ereditata da una classe che fornisce un'implementazione di metodi o proprietà abstract.

Se applicato a un metodo o a una proprietà, il modificatore sealed deve essere sempre utilizzato con override.

Poiché le strutture sono implicitamente sealed, non possono essere ereditate.

Per ulteriori informazioni, vedere la classe Ereditarietà (Guida per programmatori 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

Nell'esempio riportato in precedenza, se si tentasse di ereditare dalla classe sealed utilizzando l'istruzione seguente:

class MyDerivedC: SealedClass {} // Error

verrebbe restituito un messaggio di errore:

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

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere le sezioni riportate di seguito in Specifiche del linguaggio C#:

  • 10.1.1.2 Classi sealed

  • 10.6.5 Metodi sealed

Note

Per determinare se contrassegnare come sealed una classe, un metodo o una proprietà, è in genere opportuno considerare i due punti seguenti:

  • I vantaggi potenziali dati dalla possibilità di personalizzare la classe grazie alla derivazione di classi.

  • La possibilità che la derivazione di classi modifichi le classi in modo da impedirne il funzionamento corretto o previsto.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Parole chiave di C#

Classi statiche e membri di classi statiche (Guida per programmatori C#)

Classi e membri delle classi astratte e sealed (Guida per programmatori C#)

Modificatori di accesso (Guida per programmatori C#)

Modificatori (Riferimenti per C#)

override (Riferimenti per C#)

virtual (Riferimenti per C#)

Altre risorse

Riferimenti per C#