Kotlin lezárt osztályok

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 Exprosztá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 whenkifejezé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 Exprosztályból, a fordító panaszkodni fog, hacsak az alosztályt nem kezeli a whenkifejezé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 privatealapé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.

érdekes cikkek...