Strasznie skaczę po tematach jeśli chodzi o Kotlina, ale lepiej jest wybrać kilka fajnych rzeczy i je opisać niż lecieć materiał w postaci „35 część tutoriala”. Dziś na tapecie klasy zapieczętowane, czyli oznaczone jako sealed.

Definicja takiej klasy jest prosta:

Listing 1. Klasa zapieczętowana

sealed class Expr

Zabawa zaczyna się jednak w momencie gdy przyjrzymy się znaczeniu słówka sealed. Domyślnie w Kotlinie wszystkie klasy są finalne. Nie można ich rozszerzać. Podobnie ma są sprawa z klasami zapieczętowanymi z tą różnicą, że rozszerzanie jest dopuszczalne tylko wtedy gdy klasa dziedzicząca jest klasą wewnętrzną:

Listing 2. Rozszerzanie klasy zapieczętowanej

sealed class Expr{
   class Const(val number:Double) : Expr()
   class Sum(val l:Expr, val r:Expr) : Expr()
}

class Mult(val l:Expr, val r:Expr) : Expr() // to się wywali

I tradycyjnie już tego typu konstrukcje mają zastosowanie we wszelkiego rodzaju parserach i interpreterach:

Listing 3. Użycie klasy zapieczętowanej

fun eval(expr: Expr) :Double = when(expr){
    is Expr.Const -> expr.number
    is Expr.Sum -> eval(expr.l) + eval(expr.r)
}

fun main(args: Array<string>) {

    println (eval(Expr.Sum(Expr.Const(1.0), Expr.Const(1.0))))
}

</string>

Oczywiście Kotlin w tym konkretnym przypadku nie zrobi magicznej sztuczki i przy długim wyrażeniu zabraknie mu stosu, ale cóż…

Podsumowując. Klasy zapieczętowane w Kotlinie pokrywają część zagadnień związanych z programowaniem w oparciu o typy. Jest weekend majowy więc nie bardzo mi się chce, ale mam do dokończenia większy tekst o tego typu pisaniu kodu w Javie. W każdym razie…