Klasy zapieczętowane w Kotlinie
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…