歡迎關注 二師兄Kotlin
轉載請注明出處 二師兄kotlin
密封類用來表示受限的類繼承結構:當一個值為有限集中的類型、而不能有任何其他類型時。在某種意義上,他們是枚舉類的擴展:枚舉類型的值集合也是受限的,但每個枚舉常量只存在一個實例,而密封類的一個子類可以有可包含狀態的多個實例。
要聲明一個密封類,需要在類名前面添加 sealed 修飾符。雖然密封類也可以有子類,但是所有子類都必須在與密封類自身相同的文件中聲明。(在 Kotlin 1.1 之前, 該規則更加嚴格:子類必須嵌套在密封類聲明的內部)。
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
(上文示例使用了 Kotlin 1.1 的一個額外的新功能:數據類擴展包括密封類在內的其他類的可能性。 )
一個密封類是自身抽象的,它不能直接實例化并可以有抽象(abstract)成員。
密封類不允許有非-private 構造函數(其構造函數默認為 private)。
請注意,擴展密封類子類的類(間接繼承者)可以放在任何位置,而無需在同一個文件中。
用密封類的關鍵好處在于使用when
表達式 的時候,如果能夠驗證語句覆蓋了所有情況,就不需要為該語句再添加一個 else
子句了。當然,這只有當你用 when
作為表達式(使用結果)而不是作為語句時才有用。
fun eval(expr: Expr): Double = when(expr) {
is Const -> expr.number
is Sum -> eval(expr.e1) + eval(expr.e2)
NotANumber -> Double.NaN
// the `else` clause is not required because we've covered all the cases
}