密封類用來表示受限的類繼承結構:當乙個值為有限幾種的型別、而不能有任何其他型別時。在某種意義上,他們是列舉類的擴充套件:列舉型別的值集合也是受限的,但每個列舉常量只存在乙個例項,而密封類的乙個子類可以有可包含狀態的多個例項。
要宣告乙個密封類,需要在類名前面新增 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)
Kotlin學習筆記(三) Kotlin密封類
前言 密封類,可以理解為列舉,規定了有限個型別,不可以存在其他型別,但列舉每個列舉常量只存在乙個示例,但是密封類的子類可以有多個示例,所以可以將密封類看做是列舉的拓展,基於列舉,高於列舉,青出於藍而勝於藍。正文密封類和普通類的區別,在於密封類使用了sealed修飾符,雖然密封類也可以有子類,但是所有...
Kotlin學習筆記 六 資料類與密封類
我們經常建立一些只儲存資料的類。在這些類中,一些標準函式往往是從資料機械推導而來的。在 kotlin 中,這叫做 資料類 並標記為 data data class person val name string val age int 為了確保生成的 的一致性以及有意義的行為,資料類必須滿足以下要求 ...
Kotlin 資料類與密封類
資料類 kotlin 可以建立乙個只包含資料的類,關鍵字為 data data class user val name string,val age int 編譯器會自動的從主建構函式中根據所有宣告的屬性提取以下函式 equals hashcode tostring 格式如 user name jo...