Kotlin面向對象之封閉類(Sealed Classes)

封閉類用于反應被限制了的類層次結構:一個值的類型只能是有限集合中的一種,而不能是集合外的其他類型。它們在某種意義上是枚舉類的擴展:枚舉類型的值的集合也被限制,每個枚舉常量僅作為單個實例存在;然而封閉類的子類可以有多個實例,且這些實例仍然可以持有狀態。

要想聲明一個封閉類,需要在類名前添加sealed修飾符。一個封閉類可以有子類,但是這些子類必須在和封閉類同一個文件中聲明。(在Kotlin1.1之前,規則更苛刻:子類必須嵌套在封閉類的內部)。

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
}

(上面這段代碼使用了Kotlin1.1的一個新特性:數據類可以繼承其他類,也包括封閉類。)

注意:繼承(直接繼承)封閉類的子類的類,可以放置在其他任意地方,不必非要放在同一個文件中。

使用密封類的關鍵好處是在使用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
    // the `else` clause is not required because we've covered all the cases
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,881評論 1 10
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 常量與變量使用let來聲明常量,使用var來聲明變量。聲明的同時賦值的話,編譯器會自動推斷類型。值永遠不會被隱式轉...
    莫_名閱讀 466評論 0 1
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,924評論 18 139
  • 你說我經常給你添麻煩,麻煩死了,於是我學著再也不找你,能自己幹就幹,不能就算了。 你說我哭的時候比笑的時候更好看,...
    小海妖MIKA閱讀 169評論 0 0