förseglad (C#-referens)
När den tillämpas på en klass hindrar sealed
-modifieraren andra klasser från att ärva från den. I följande exempel ärver klass B
från klassen A
, men ingen klass kan ärva från klassen B
.
class A {}
sealed class B : A {}
Du kan också använda sealed
-modifieraren för en metod eller egenskap som åsidosätter en virtuell metod eller egenskap i en basklass. På så sätt kan du tillåta klasser att härleda från din klass och hindra dem från att åsidosätta specifika virtuella metoder eller egenskaper.
Exempel
I följande exempel ärver Z
från Y
men Z
kan inte åsidosätta den virtuella funktionen F
som deklareras i X
och är förseglad i 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"); }
}
När du definierar nya metoder eller egenskaper i en klass kan du förhindra deriverade klasser från att åsidosätta dem genom att inte deklarera dem som virtuella.
När du åsidosätter en virtual
medlem som deklarerats i en bastyp kan du förhindra att härledda typer åsidosätter dem med hjälp av förseglade nyckelord som i följande exempel:
public sealed override string ToString() => Value;
Det är ett fel att använda abstrakt modifierare med en förseglad klass, eftersom en abstrakt klass måste ärvas av en klass som tillhandahåller en implementering av abstrakta metoder eller egenskaper.
När den används på en metod eller egenskap, måste modifieraren sealed
alltid användas tillsammans med åsidosättningen .
Eftersom structs är implicit förseglade kan de inte ärvas.
Mer information finns i Arv.
Fler exempel finns i abstrakta och förseglade klasser och klassmedlemmar.
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
I föregående exempel kan du försöka ärva från den förseglade klassen med hjälp av följande instruktion:
class MyDerivedC: SealedClass {} // Error
Resultatet är ett felmeddelande:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Anmärkningar
För att avgöra om du vill försegla en klass, metod eller egenskap bör du vanligtvis överväga följande två punkter:
De potentiella fördelar som härledda klasser kan få genom möjligheten att skräddarsy en klass.
Risken för att klasser som härleds kan ändra dina klasser så att de inte längre fungerar korrekt eller som förväntat.
Språkspecifikation för C#
Mer information finns i C#-språkspecifikationen. Språkspecifikationen är den slutgiltiga källan för C#-syntax och -användning.