Šiame straipsnyje sužinosite apie uždarytą klasę, kaip jie kuriami ir kada juos naudoti, pasitelkdami pavyzdžius.
Uždarosios klasės naudojamos, kai reikšmė gali turėti tik vieną iš tipų iš riboto rinkinio (ribotos hierarchijos).
Prieš pradėdami išsamiai aprašyti uždaras klases, panagrinėkime, kokią problemą jie išsprendžia. Paimkime pavyzdį (paimtas iš oficialios „Kotlin“ svetainės - straipsnis „Uždarytos klasės“):
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") )
Pirmiau pateiktoje programoje bazinė klasė „Expr“ turi dvi išvestines klases „Const“ (reiškia skaičių) ir „Sum“ (reiškia dviejų išraiškų sumą). Čia yra privaloma naudoti else
filialą kaip numatytąją sąlygą, kai išraiškoje.
Dabar, jei iš Expr
klasės įgysite naują poklasį , kompiliatorius nieko neaptiks, nes else
filialas tvarko tai, kas gali sukelti klaidų. Būtų buvę geriau, jei kompiliatorius išleido klaidą, kai pridėjome naują poklasį.
Norėdami išspręsti šią problemą, galite naudoti uždarą klasę. Kaip minėta, uždara klasė riboja galimybę kurti poklasius. Kai when
išraiškoje tvarkote visus sandarios klasės poklasius, nebūtina naudoti else
šakos.
Norėdami sukurti sandarią klasę, naudojamas sandarus modifikatorius. Pavyzdžiui,
užplombuota klasė
Pavyzdys: sandari klasė
Štai kaip galite išspręsti minėtą problemą naudodami uždarą klasę:
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 )
Kaip matote, else
šakos nėra . Jei iš Expr
klasės išgaunate naują poklasį , kompiliatorius skundžiasi, nebent poklasis yra tvarkomas when
išraiškoje.
Nedaug svarbių pastabų
- Visi užplombuotos klasės poklasiai turi būti deklaruojami toje pačioje byloje, kur deklaruojama užplombuota klasė.
- Užantspauduota klasė pati savaime yra abstrakti ir jūs negalite iš jos objektų užfiksuoti.
- Negalite kurti neprivatių sandarios klasės konstruktorių; jų konstruktoriai yra
private
pagal nutylėjimą.
Skirtumas tarp „Enum“ ir „Seal“ klasės
Enum klasė ir sandari klasė yra gana panašios. „Enum“ tipo verčių rinkinys taip pat yra ribojamas kaip sandari klasė.
Vienintelis skirtumas yra tas, kad „enum“ gali turėti tik vieną egzempliorių, o užantspauduotos klasės poklasis gali turėti kelis egzempliorius.