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