lezárt (C# referencia)
Egy osztályra alkalmazva a sealed
módosító megakadályozza, hogy más osztályok örököljenek belőle. Az alábbi példában az B
osztály az A
osztálytól örököl, de egyetlen osztály sem örökölhet B
osztályból.
class A {}
sealed class B : A {}
A sealed
módosító olyan metóduson vagy tulajdonságon is használható, amely felülbírál egy virtuális metódust vagy tulajdonságot egy alaposztályban. Ez lehetővé teszi, hogy az osztályok az osztályból származhassanak, és megakadályozzák, hogy felülírjanak bizonyos virtuális metódusokat vagy tulajdonságokat.
Példa
Az alábbi példában a Z
örökíti a Y
-t, de a Z
nem tudja felülbírálni a F
virtuális függvényt, amely a X
-ben van deklarálva és a Y
-ben van lezárva.
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"); }
}
Ha új metódusokat vagy tulajdonságokat határoz meg egy osztályban, megakadályozhatja, hogy a származtatott osztályok felülírják őket, ha nem deklarálja őket virtuális.
Ha felülbírál egy alaptípusban deklarált virtual
tagot, megakadályozhatja, hogy a származtatott típusok felülbírálják őket lezárt kulcsszó használatával, ahogyan az alábbi példában látható:
public sealed override string ToString() => Value;
Hiba az absztrakciós módosító zárt osztálysal való használata, mert az absztrakt osztályt egy olyan osztálynak kell örökölnie, amely az absztrakt metódusok vagy tulajdonságok implementálását biztosítja.
Metódusra vagy tulajdonságra alkalmazva a sealed
módosítót mindig felülbíráláskell használni.
Mivel a szerkezetek implicit módon vannak lezárva, nem örökölhetők.
További információ: Öröklés.
További példákért lásd absztrakt és lezárt osztályok és osztálytagok.
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
Az előző példában az alábbi utasítással megpróbálhatja örökölni a lezárt osztályt:
class MyDerivedC: SealedClass {} // Error
Az eredmény egy hibaüzenet:
'MyDerivedC': cannot derive from sealed type 'SealedClass'
Megjegyzések
Annak megállapításához, hogy osztályt, metódust vagy tulajdonságot szeretne-e lezárni, általában a következő két pontot kell figyelembe vennie:
A származtatott osztályok számára elérhető potenciális előnyök, amelyeket az osztály testreszabásának képessége nyújthat.
Az osztályok származtatásának lehetősége úgy módosíthatja az osztályokat, hogy azok már nem működnek megfelelően vagy a várt módon.
C# nyelvspecifikáció
További információ: C# nyelvi specifikáció. A nyelvi specifikáció a C#-szintaxis és -használat végleges forrása.