A InfoWiki wikiből
SEALED kulcsszó
A 'sealed' módosítót elsősorban osztályokra alkalmazhatjuk. Jelentése: 'lepecsételt'.
sealed class Console { ... }
Ezen módosító azt jelenti, hogy a megjelölt osztály később ősként nem választható más osztályok számára. Vagyis továbbfejlesztése nem lehetséges. Az osztály befejezett.
Egy 'sealed' class használata esetén a fordító bizonyos optimalizálásokat végezhet el, például bizonyos virtuális metódushívásokat feloldhat korai kötéssel, mivel ismert,hogy az osztálynak további leszármazottjai nem lesznek.
Mivel ez ellentmond az 'abstract' módosító használatának (annál a gyermekosztályok készítésegyakorlatilag kötelező), így az két módosító nem használható együtt.
A 'struct' kulcsszóval készített 'osztályok' (érték-típusú objektum-osztályok) eleve 'sealed' jelzéssel bírnak, így egyetlen ilyen osztályból sem készíthető gyermekosztály.
SEALED metódusok esetén
A 'sealed' jelzést metódusok bevezetésekor még nem, de felülírásakor már alkalmazhatjuk:
class Auto { public virtual void Elindit() { ... } } // --- class Kombajn { public override sealed void Elindit() { ... } }
A fenti eset azt jelenti, hogy a 'Kombajn' osztálynak elvileg lehetnek gyerekosztályai,de ezek egyike sem override-olhatja az 'Elindit()' metódust a továbbiakban.
Ilyetén használata ritkán, csak indokolt esetben fordul elő.
Ha egy metódusra a 'sealed' módosítót kívánunk helyezni, akkor annak kötelezően az 'override' módosítóval kell együtt szerepelnie (C# Language Specification 1.2, 10.5.5 fejezet). Ez azt jelenti, hogy csakis virtuális metódusokra alkalmazható a sealed, és bevezetéskor még nem (a virtual kulcsszó mellett még nem alkalmazható), hanem legkorábban az első gyermekosztályban az első override esetén vezethető be.
Ennek értelme az, hogy a 'virtual' és 'sealed' jelentéstartalma ellentmondana egymásnak. Hiszen a 'virtual'-al azt kívánjuk jelezni, hogy a gyermekosztályok ezen metódust (valószínűleg) felül fogják definiálni, és utasítjuk a fordítót, hogy e miatt alkalmazzon késői kötést, hogy a kellő rugalmasság meglegyen. A 'sealed' pontosan ezt a felüldefiniálhatóságot tiltja le, tehát értelmetlen lenne 'virtual sealed' metódust készíteni.
A nem 'virtual' metódusok esetén a 'sealed' használatának lenne értelme, de ezt a 'new'-al történő újbóli bevezetés egyébként megkerülné. Valamint a nem virtuális metódusok esetén mindenképpen a korai kötés van alkalmazva, ennek működése mellett nincs szükség a 'sealed' módosítóra, hiszen az újonnan bevezetett változatot visszamenőlegesen az ős osztályok amúgy sem használnák.
SEALED property esetén
A metódusok zárolásához hasonló működést eredményez, ha a 'sealed' kulcsszót property-kre alkalmazzuk (megj: a property is lehet virtual + override!).