1. 程式人生 > >Kotlin學習(14):密封類

Kotlin學習(14):密封類

密封類用來表示受限的類繼承結構:當一個值為有限集的型別、而不能有任何其它型別時。在某種意義上,它們是列舉類的擴充套件:列舉型別的值集合也是受限制的,但每個列舉常量只存在一個例項,而密封類的一個子類可以有包含狀態的多個例項。

要宣告一個密封類,需要在類名前面新增sealed修飾符。雖然密封類也可以有子類,但是所有子類都必須在與密封類自身相同的檔案中宣告。

sealed class Expr

data class Const(val number: Double) : Expr()

data class Sum(val e1: Expr, val e2: Expr) : Expr()

object
NotANumber : Expr() fun eval(expr: Expr): Double = when (expr) { is Const -> expr.number is Sum -> eval(expr.e1) + eval(expr.e2) NotANumber -> Double.NaN }

擴充套件密封類子類的類可以放在任何位置,無需在同一個檔案中。

使用密封類的關鍵好處在於使用when表示式的時候,如果能夠驗證語句覆蓋了所有情況,就不需要為該語句再新增一個else子句了。

fun eval(expr: Expr): Double = when (expr) {
    is Expr.Const
-> expr.number is Expr.Sum -> eval(expr.e1) + eval(expr.e2) Expr.NotANumber -> Double.NaN }

這裡不再需要else子句,因為我們已經覆蓋了所有的情況。