Kotlin密封類_Kotlin

來源:互聯網
上載者:User

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

要聲明一個密封類,需要在類名前面添加 sealed 修飾符。雖然密封類也可以
有子類,但是所有子類都必須在與密封類自身相同的檔案中聲明。(在 Kotlin 1.1 之前,
該規則更加嚴格:子類必須嵌套在密封類聲明的內部)。

sealed class Exprdata 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}
Kotlin

(上文樣本使用了 Kotlin 1.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    // 不再需要 `else` 子句,因為我們已經覆蓋了所有的情況}
Kotlin

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.