Triedy uzavreté Kotlinom

V tomto článku sa dozviete o lekciách Sealed, ako sú vytvorené a kedy ich treba pomocou príkladov použiť.

Uzavreté triedy sa používajú, keď hodnota môže mať iba jeden z typov z obmedzenej množiny (obmedzené hierarchie).

Predtým, ako sa pozrieme na podrobnosti o zapečatených triedach, poďme preskúmať, aký problém riešia. Zoberme si príklad (prevzatý z oficiálneho webu Kotlin - článok Sealed classes):

 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") )

Vo vyššie uvedenom programe má základná trieda Expr dve odvodené triedy Const (predstavuje číslo) a Sum (predstavuje súčet dvoch výrazov). Tu je povinné použiť elsevetvu ako predvolenú podmienku vo výraze.

Teraz, ak odvodíte novú podtriedu z Exprtriedy, kompilátor nezistí nič, pretože elseju obsluhuje pobočka, čo môže viesť k chybám. Bolo by lepšie, keby kompilátor vydal chybu, keď sme pridali novú podtriedu.

Ak chcete vyriešiť tento problém, môžete použiť zapečatenú triedu. Ako už bolo spomenuté, zapečatená trieda obmedzuje možnosť vytvárania podtried. A keď vo whenvýraze narábate so všetkými podtriedami zapečatenej triedy , nie je potrebné používať elsevetvu.

Na vytvorenie zapečatenej triedy sa používa zapečatený modifikátor. Napríklad,

 zapečatená trieda Expr

Príklad: zapečatená trieda

Tu je príklad, ako môžete vyriešiť vyššie uvedený problém pomocou zapečatenej triedy:

 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 ) 

Ako vidíte, neexistuje žiadna elsepobočka. Ak odvodíte novú podtriedu z Exprtriedy, kompilátor sa bude sťažovať, pokiaľ sa s podtriedou vo whenvýraze nespracuje.

Niekoľko dôležitých poznámok

  • Všetky podtriedy zapečatenej triedy musia byť deklarované v rovnakom súbore, kde je vyhlásená zapečatená trieda.
  • Zapečatená trieda je sama o sebe abstraktná a nemôžete z nej vytvoriť inštanciu.
  • Nemôžete vytvoriť neverejné konštruktory zapečatenej triedy; ich konštruktory sú privatepredvolene.

Rozdiel medzi Enum a Sealed Class

Trieda Enum a zapečatená trieda sú si dosť podobné. Množina hodnôt pre typ enum je tiež obmedzená ako zapečatená trieda.

Jediný rozdiel je v tom, že enum môže mať iba jednu inštanciu, zatiaľ čo podtrieda zapečatenej triedy môže mať viac inštancií.

Zaujímavé články...