Kotlin forseglede klasser

I denne artikkelen vil du lære om forseglet klasse, hvordan de blir opprettet, og når du skal bruke dem ved hjelp av eksempler.

Forseglede klasser brukes når en verdi bare kan ha en av typene fra et begrenset sett (begrensede hierarkier).

Før vi går inn i detaljer om forseglede klasser, la oss utforske hvilket problem de løser. La oss ta et eksempel (hentet fra det offisielle Kotlin-nettstedet - Sealed Classes Article):

 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 programmet ovenfor har basisklassen Expr to avledede klasser Const (representerer et tall) og Sum (representerer summen av to uttrykk). Her er det obligatorisk å bruke elsefilial for standardtilstand i når uttrykk.

Nå, hvis du henter en ny underklasse fra Exprklassen, vil ikke kompilatoren oppdage noe når elsegrenen håndterer det som kan føre til feil. Det hadde vært bedre om kompilatoren utstedte en feil da vi la til en ny underklasse.

For å løse dette problemet kan du bruke forseglet klasse. Som nevnt begrenser forseglet klasse muligheten for å lage underklasser. Og når du håndterer alle underklasser av en forseglet klasse i et whenuttrykk, er det ikke nødvendig å bruke elsegren.

For å opprette en forseglet klasse, brukes forseglet modifikator. For eksempel,

 forseglet klasse Uttr

Eksempel: Forseglet klasse

Slik kan du løse problemet ovenfor ved hjelp av 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 ser er det ingen elsegren. Hvis du henter en ny underklasse fra Exprklassen, vil kompilatoren klage med mindre underklassen blir håndtert i whenuttrykket.

Få viktige merknader

  • Alle underklasser av en forseglet klasse må deklareres i samme fil der forseglet klasse er erklært.
  • En forseglet klasse er i seg selv abstrakt, og du kan ikke instantiere objekter fra den.
  • Du kan ikke lage ikke-private konstruktører av en forseglet klasse; deres konstruktører er privatesom standard.

Forskjellen mellom enum og forseglet klasse

Enum-klasse og forseglet klasse er ganske like. Verdisettet for enumtype er også begrenset som en forseglet klasse.

Den eneste forskjellen er at enum kan ha bare en enkelt forekomst, mens en underklasse av en forseglet klasse kan ha flere forekomster.

Interessante artikler...