fel
le

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 (ez esetben a gyermekosztályok készítése gyakorlatilag 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:Auto
{
  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!).

STATIC módosító

A Static módosítót nem csak metódusok és mezők elé tehetjük ki, hanem osztályok elé is:

static class Bongeszo
{
  // ...
}
 

A 'static' osztályok csak statikus (osztályszintű) mezőket, metódusokat tartalmazhatnak, példányszintű mező, metódus, property nem szerepelhet bennük. Hasonlóképp: példányszintű konstruktor sem! Ez egyúttal azt is jelenti, hogy nem csak hogy mi nem írhatunk bele konstruktort, de a fordító sem generál bele üres törzsű és paraméterezésű konstruktort.

Példányszintű konstruktor hiányában példányosítás ezen osztályból nem lehetséges, még Object Factory segítségével sem. A konstruktor hívási lánc miatt gyerekosztály sem készíthető ezen osztályból, mivel a gyerekosztály konstruktorai a ':base()' segítségével sem képesek konstruktort hívni az ősosztályban.

A 'static' osztálymódosító e miatt erősebb hatású mint a 'sealed' osztálymódosító. A miatt mindkét módosító egy időben értelmetlen, és nem is szerepelhetnek egyszerre ugyanazon osztály előtt. Ez utóbbit szintaktikai hibának tekinti a fordítóprogram.

Hernyák Zoltán
2013-03-17 18:46:09