Ebben a cikkben a példák segítségével megismerheti a Sealed osztályt, hogyan jönnek létre és mikor kell használni őket.
A lezárt osztályokat akkor használjuk, ha az értéknek csak egy típusa lehet egy korlátozott halmazból (korlátozott hierarchiák).
Mielőtt részletesen foglalkoznánk a lezárt osztályokkal, vizsgáljuk meg, hogy milyen problémát oldanak meg. Vegyünk egy példát (a Kotlin hivatalos weboldaláról - Zárt osztályok cikk)
class Expr class Const(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") )
A fenti programban az Expr alaposztálynak két levezetett osztálya van: Const (számot képvisel) és Sum (két kifejezés összegét képviseli). Itt kötelező az else
ágat használni alapértelmezett feltételként a when kifejezésben.
Most, ha új alosztályt vezet le az Expr
osztályból, a fordító nem észlel semmit, mivel az else
ág kezeli azt, ami hibákhoz vezethet. Jobb lett volna, ha a fordító hibát ad ki, amikor új alosztályt adunk hozzá.
A probléma megoldásához használhatja a lezárt osztályt. Mint említettük, a lezárt osztály korlátozza az alosztályok létrehozásának lehetőségét. És amikor egy lezárt osztály összes alosztályát egy when
kifejezésben kezeli , nem szükséges else
ágat használni .
A lezárt osztály létrehozásához zárt módosítót használnak. Például,
pecsétes osztály Expr
Példa: Zárt osztály
Így oldhatja meg a fenti problémát a lezárt osztály használatával:
sealed class Expr class Const(val value: Int) : Expr() class Sum(val left: Expr, val right: Expr) : Expr() object NotANumber : Expr() fun eval(e: Expr): Int = when (e) ( is Const -> e.value is Sum -> eval(e.right) + eval(e.left) NotANumber -> java.lang.Double.NaN )
Amint láthatja, nincs else
ág. Ha új alosztályt vezet le az Expr
osztályból, a fordító panaszkodni fog, hacsak az alosztályt nem kezeli a when
kifejezés.
Néhány fontos megjegyzés
- A lezárt osztály minden alosztályát ugyanabban az aktában kell bejelenteni, ahol a lezárt osztályt deklarálják.
- A lezárt osztály önmagában elvont, és nem lehet objektumokat belőle példázni.
- Nem hozhat létre nem zárt osztályú kivitelezőket; kivitelezőik
private
alapértelmezés szerint.
Különbség az Enum és a Sealed osztály között
Az Enum osztály és a zárt osztály elég hasonló. Az enum típus értékkészlete szintén korlátozott, mint egy lezárt osztály.
Az egyetlen különbség az, hogy az enumnak csak egyetlen példánya lehet, míg egy lezárt osztály egyik alosztályának több példánya lehet.