Verzegeld (C#-referentie)
Wanneer deze wordt toegepast op een klasse, voorkomt de sealed
wijzigingsfunctie dat andere klassen ermee worden overgenomen. In het volgende voorbeeld neemt klasse B
over van klasse A
, maar kan geen klasse overnemen van klasse B
.
class A {}
sealed class B : A {}
U kunt de sealed
modifier 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.
Voorbeeld
In het volgende voorbeeld neemt Z
over van Y
, maar Z
kan de virtuele functie niet overschrijven F
die is gedeclareerd in X
en verzegeld 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"); }
}
Wanneer u nieuwe methoden of eigenschappen in een klasse definieert, kunt u voorkomen dat klassen worden overschreven door ze niet als virtuelete declareren.
Wanneer u een virtual
-lid overschrijft dat is gedeclareerd in een basistype, kunt u voorkomen dat afgeleide typen deze overschrijven door het sleutelwoord sealed te gebruiken, zoals in het volgende voorbeeld:
public sealed override string ToString() => Value;
Het is een fout om de abstracte modifier te gebruiken 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 overschrijven van.
Omdat structs impliciet zijn verzegeld, kunnen ze niet worden overgenomen.
Zie Overnamevoor meer informatie.
Zie abstracte en verzegelde klassen en klasseledenvoor 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 erven van de sealed class 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 potentiƫle voordelen die afgeleide klassen kunnen verwerven door de mogelijkheid om uw klasse aan te passen.
De mogelijkheid dat afgeleide klassen uw klassen zodanig wijzigen dat ze niet meer correct of zoals verwacht functioneren.
C#-taalspecificatie
Zie de C#-taalspecificatievoor meer informatie. De taalspecificatie is de definitieve bron voor de C#-syntaxis en het gebruik.