sealed (Riferimenti per C#)
Se applicato a una classe, il modificatore sealed
impedisce ad altre classi di ereditarvi. Nell'esempio seguente la classe B
eredita dalla classe A
, ma nessuna classe può ereditare dalla classe B
.
class A {}
sealed class B : A {}
È anche possibile usare il modificatore sealed
su un metodo o una proprietà che esegue l'override di un metodo virtuale o di una proprietà in una classe di base. In questo modo è possibile consentire alle classi di derivare dalla classe e impedire loro di eseguire l'override di specifici metodi virtuali o proprietà.
Esempio
Nell'esempio seguente Z
eredita da Y
, ma Z
non può eseguire l'override della funzione virtuale F
dichiarata in X
e sigillata 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("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"); }
}
Quando si definiscono nuovi metodi o proprietà in una classe, è possibile impedire la derivazione delle classi eseguendo l'override di tali classi non dichiarandole come virtuale .
È possibile impedire ai tipi derivati di eseguire l'override di un membro virtual
dichiarato in un tipo di base usando la parola chiave sealed, come nell'esempio seguente:
public sealed override string ToString() => Value;
È un errore usare il modificatore astrazione
Se applicato a un metodo o a una proprietà, il modificatore sealed
deve essere sempre usato con override.
Poiché le strutture sono definite in modo implicito, non possono essere ereditate.
Per ulteriori informazioni, consultare il capitolo Ereditarietà.
Per altri esempi, vedere classi astratte e sigillate, e membri della 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
Nell'esempio precedente è possibile provare a ereditare dalla classe sealed usando l'istruzione seguente:
class MyDerivedC: SealedClass {} // Error
Il risultato è un messaggio di errore:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Osservazioni
Per determinare se bloccare una classe, un metodo o una proprietà, è in genere consigliabile considerare i due punti seguenti:
I vantaggi potenziali che le classi derivanti potrebbero ottenere grazie alla possibilità di personalizzare la vostra classe.
Il potenziale delle classi derivate potrebbe modificare le tue classi in modo tale che non funzionino più correttamente o come previsto.
Specifica del linguaggio C#
Per ulteriori informazioni, consulta le Specifiche del linguaggio C# . La specifica del linguaggio è l'origine definitiva per la sintassi e l'utilizzo di C#.