歡迎關(guān)注 二師兄Kotlin
轉(zhuǎn)載請(qǐng)注明出處 二師兄kotlin
密封類用來(lái)表示受限的類繼承結(jié)構(gòu):當(dāng)一個(gè)值為有限集中的類型吗冤、而不能有任何其他類型時(shí)。在某種意義上碱妆,他們是枚舉類的擴(kuò)展:枚舉類型的值集合也是受限的,但每個(gè)枚舉常量只存在一個(gè)實(shí)例,而密封類的一個(gè)子類可以有可包含狀態(tài)的多個(gè)實(shí)例抵屿。
要聲明一個(gè)密封類,需要在類名前面添加 sealed 修飾符捅位。雖然密封類也可以有子類轧葛,但是所有子類都必須在與密封類自身相同的文件中聲明。(在 Kotlin 1.1 之前艇搀, 該規(guī)則更加嚴(yán)格:子類必須嵌套在密封類聲明的內(nèi)部)尿扯。
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 的一個(gè)額外的新功能:數(shù)據(jù)類擴(kuò)展包括密封類在內(nèi)的其他類的可能性。 )
一個(gè)密封類是自身抽象的焰雕,它不能直接實(shí)例化并可以有抽象(abstract)成員衷笋。
密封類不允許有非-private 構(gòu)造函數(shù)(其構(gòu)造函數(shù)默認(rèn)為 private)。
請(qǐng)注意矩屁,擴(kuò)展密封類子類的類(間接繼承者)可以放在任何位置辟宗,而無(wú)需在同一個(gè)文件中。
用密封類的關(guān)鍵好處在于使用when
表達(dá)式 的時(shí)候吝秕,如果能夠驗(yàn)證語(yǔ)句覆蓋了所有情況泊脐,就不需要為該語(yǔ)句再添加一個(gè) else
子句了。當(dāng)然烁峭,這只有當(dāng)你用 when
作為表達(dá)式(使用結(jié)果)而不是作為語(yǔ)句時(shí)才有用容客。
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
}