„Kotlin“ sandarios klasės

Š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 elsefilialą kaip numatytąją sąlygą, kai išraiškoje.

Dabar, jei iš Exprklasės įgysite naują poklasį , kompiliatorius nieko neaptiks, nes elsefilialas 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 wheniš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š Exprklasės išgaunate naują poklasį , kompiliatorius skundžiasi, nebent poklasis yra tvarkomas wheniš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 privatepagal 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.

Įdomios straipsniai...