Condividi tramite


sealed (Riferimenti per C#)

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, Z eredita da Y ma Z non può eseguire l'override della funzione virtuale F dichiarata in X e contrassegnata come sealed in 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("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 Ereditarietà (Guida per programmatori C#).

Per ulteriori esempi, vedere Classi e membri delle classi astratte e sealed (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 la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

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

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#)

Concetti

Guida per programmatori C#

Altre risorse

Riferimenti per C#