Verzegeld (C#-verwijzing)
Wanneer deze wordt toegepast op een klasse, voorkomt de sealed
wijzigingsfunctie dat andere klassen ervan overnemen. In het volgende voorbeeld wordt de klasse B
overgenomen van klasse A
, maar kan geen klasse overnemen van klasse B
.
class A {}
sealed class B : A {}
U kunt de sealed
wijzigingsfunctie ook gebruiken voor een methode of eigenschap die een virtuele methode of eigenschap in een basisklasse overschrijft. Hierdoor kunt u klassen toestaan om af te leiden van uw klasse en te voorkomen dat ze specifieke virtuele methoden of eigenschappen overschrijven.
Opmerking
In het volgende voorbeeld Z
wordt de virtuele functie F
die is gedeclareerd in en verzegeld, X
Y
overgenomen van Y
maar Z
niet overschreven.
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"); }
}
Wanneer u nieuwe methoden of eigenschappen in een klasse definieert, kunt u voorkomen dat klassen worden overschreven door ze niet als virtueel te declareren.
Het is een fout bij het gebruik van de abstracte modifier met een verzegelde klasse, omdat een abstracte klasse moet worden overgenomen door een klasse die een implementatie van de abstracte methoden of eigenschappen biedt.
Wanneer deze wordt toegepast op een methode of eigenschap, moet de sealed
modifier altijd worden gebruikt met onderdrukking.
Omdat structs impliciet zijn verzegeld, kunnen ze niet worden overgenomen.
Zie Overname voor meer informatie.
Zie Abstracte en verzegelde klassen en klasleden voor meer voorbeelden.
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
In het vorige voorbeeld kunt u proberen om over te nemen van de verzegelde klasse met behulp van de volgende instructie:
class MyDerivedC: SealedClass {} // Error
Het resultaat is een foutbericht:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Opmerkingen
Als u wilt bepalen of u een klasse, methode of eigenschap wilt verzegelen, moet u over het algemeen rekening houden met de volgende twee punten:
De mogelijke voordelen die klassen afleiden, kunnen profiteren door de mogelijkheid om uw klas aan te passen.
Het potentieel dat klassen afleiden, kan uw klassen zodanig wijzigen dat ze niet meer correct of zoals verwacht werken.
C#-taalspecificatie
Zie de C#-taalspecificatie voor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.