Kotlin forseglede klasser

I denne artikel lærer du om forseglet klasse, hvordan de oprettes, og hvornår de skal bruges ved hjælp af eksempler.

Forseglede klasser bruges, når en værdi kun kan have en af ​​typerne fra et begrænset sæt (begrænsede hierarkier).

Inden vi går i detaljer om forseglede klasser, lad os undersøge, hvilket problem de løser. Lad os tage et eksempel (taget fra det officielle Kotlin-websted - Artiklen om forseglede klasser):

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

I ovenstående program har basisklassen Expr to afledte klasser Const (repræsenterer et tal) og Sum (repræsenterer summen af ​​to udtryk). Her er det obligatorisk at bruge elsefilial til standardbetingelse i når udtryk.

Nu, hvis du udleder en ny underklasse fra Exprklassen, registrerer compileren ikke noget, da elsegrenen håndterer det, der kan føre til fejl. Det ville have været bedre, hvis compileren udsendte en fejl, da vi tilføjede en ny underklasse.

For at løse dette problem kan du bruge forseglet klasse. Som nævnt begrænser forseglet klasse muligheden for at oprette underklasser. Og når du håndterer alle underklasser af en forseglet klasse i et whenudtryk, er det ikke nødvendigt at bruge elsegren.

For at oprette en forseglet klasse anvendes forseglet modifikator. For eksempel,

 forseglet klasse Ekspr

Eksempel: Forseglet klasse

Her er hvordan du kan løse ovenstående problem ved hjælp af forseglet klasse:

 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 ) 

Som du kan se, er der ingen elsegren. Hvis du udleder en ny underklasse fra Exprklassen, klager kompilatoren, medmindre underklassen håndteres i whenudtrykket.

Få vigtige bemærkninger

  • Alle underklasser af en forseglet klasse skal deklareres i den samme fil, hvor forseglet klasse er deklareret.
  • En forseglet klasse er abstrakt i sig selv, og du kan ikke instantiere objekter fra den.
  • Du kan ikke oprette ikke-private konstruktører af en forseglet klasse; deres konstruktører er privatesom standard.

Forskellen mellem enum og forseglet klasse

Enum klasse og forseglet klasse er ret ens. Værdisættet for en enumtype er også begrænset som en forseglet klasse.

Den eneste forskel er, at enum kun kan have en enkelt forekomst, mens en underklasse af en forseglet klasse kan have flere forekomster.

Interessante artikler...