【Kotlin 入門指南】密封類別(sealed class)

更新於 發佈於 閱讀時間約 5 分鐘
【Kotlin 入門指南】系列文章目錄:https://bit.ly/3t8awwL
Kotlin 線上課程教學影片:https://bit.ly/3qJ5a5Q

密封類別

當物件有限定狀態時,我們常使用「列舉列別(enum class)」。不過,它較適合用來判斷簡單的狀態,不容許變數傳遞。當需要傳遞變數運算時,我們會採用「密封類別(sealed class)」,它可視為 enum class 的進階版。

密封類允許我們建立一個有限的類別階層結構。這些類別必須被定義在同一個檔案中,這樣做是為了確保封閉性。密封類別的主要特性在於其所有的子類別必須在同一個檔案中定義,這樣做有助於更有效地控制類別繼承結構。

要定義一個密封類別,我們需要使用 sealed 關鍵字來修飾類別聲明,然後在該類別內部定義其允許的子類別。這些子類別必須直接繼承自密封類別,並且可以在同一個檔案內或相同的封閉作用域中。

密封類別範例

sealed class MySealedClass {
//密封類的成員,必須繼承自己類別 MySealedClass()
//如果沒有參數應為 object 類型
object State1 : MySealedClass()
object State2 : MySealedClass()
object State3 : MySealedClass()

//有參數可為 class 或 data class 類型
class State4(val value: Int) : MySealedClass()
}

class MyClass(private val data: MySealedClass) {
fun show() =
when (data) {
is MySealedClass.State1 -> "State1"
is MySealedClass.State2 -> "State2"
is MySealedClass.State3 -> "State3"
is MySealedClass.State4 -> "State4: ${data.value}"

//若少實現一種 MySealedClass 狀態條件判斷會噴錯,除非加入 else 判斷。
// else -> "未知狀態"
}
}

fun main() {
println(MyClass(MySealedClass.State1).show())
println(MyClass(MySealedClass.State4(100)).show())
}

在這個範例中,我們定義一個名為 MySealedClass 的密封類別,密封類的成員可以是 object 類型,像是 State1State2State3,它們不需要任何參數,代表這些狀態的存在即可。

密封類的成員也可以是帶有參數的類型,像是 State4,它是一個含有整數參數 value 的類型。這些帶參數的類型可以是一般的 class 或是 data class 類型。

接下來,在 MyClass 這個類別中,有一個接收 MySealedClass 作為參數的函式 show()。這個函式利用 when 表達式對傳入的 MySealedClass 密封類型進行模式匹配。根據不同的狀態,返回相對應的字串表示狀態。

需要特別注意的是,若沒有涵蓋到所有的密封類型,即缺少了對某個狀態的判斷,Kotlin 將會提示錯誤。為了避免這種情況,你可以加上 else 分支來處理未知的狀態,像是 else -> "未知狀態",這樣能確保所有情況都被考慮到。

最後,在 main() 函式中,展示了如何創建 MyClass 的實例並呼叫 show() 函式,透過不同的 MySealedClass 狀態輸出對應的結果。

這種模式匹配的方式能讓程式碼更為清晰,並且在處理有限類型集合時提供了更好的可擴展性和安全性。

avatar-img
13會員
259內容數
哈囉!歡迎光臨我的沙龍!我是 KT,一位對應用程式開發充滿熱情的開發者。在這個專屬空間,我將與您分享我在應用開發領域的深入學習心得和豐富的實戰經驗。如果您對應用程式開發技術同樣充滿好奇,渴望不斷探索新知,歡迎成為我們的會員,一起在應用程式開發的旅途上,探索更深層次的技術世界,享受學習的樂趣。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
HKT實驗室 的其他內容
在 Kotlin 程式語言中,資料類別 (Data classes) ,它讓你能夠輕鬆地建立和定義只用來儲存資料的類別,讓程式碼更簡潔、更容易閱讀。資料類別的主要目的是暫時保存資料,而不是處理邏輯行為。
在 Kotlin 程式語言中,使用關鍵字「interface」來定義介面。在介面中,每個函數預設都是開放的,不需要額外使用「open」關鍵字來宣告。但是,如果你要實作介面中的屬性與函數,就需要使用「override」關鍵字。 介面只定義了方法的名稱、參數和返回值,沒有方法的具體實現。
在 Kotlin 程式語言中,定義抽象類別需要在「class」關鍵字前面加上「abstract」關鍵字。在抽象類別內,若方法是抽象的,需在「fun」前面加上「abstract」。值得留意的是,抽象類別無法直接被實體化,只能被其他類別繼承並實作其中的抽象方法。
當今天某個類別,比如說 String,在不能直接修改其程式碼或無法繼承使用的情況下,你可以運用 Kotlin 的擴展功能,來擴展該類別的功能。它允許你擴展現有的類別,而不需修改其原始碼。這使得你能夠向任何類別添加新的功能,讓程式碼更具靈活性。
可以將「泛型」比喻成寶可夢中的百變怪。它允許你撰寫可以適用於多種資料類型的程式碼,而不需要重複寫多個相似的函數或類別。當你需要處理不同類型的參數,不論是類別或方法,以及各種資料型態時,泛型就能派上用場。
在 Kotlin 程式語言中,類別(Class) 扮演著關鍵角色,它能讓你建立真實存在的物件或實體。類別就像是物件的設計藍圖,描述了它們的特性和行為。而實體化(Instantiation) 則是利用這個藍圖來創造具體的實例,讓物件具備類別所定義的特性和行為。
在 Kotlin 程式語言中,資料類別 (Data classes) ,它讓你能夠輕鬆地建立和定義只用來儲存資料的類別,讓程式碼更簡潔、更容易閱讀。資料類別的主要目的是暫時保存資料,而不是處理邏輯行為。
在 Kotlin 程式語言中,使用關鍵字「interface」來定義介面。在介面中,每個函數預設都是開放的,不需要額外使用「open」關鍵字來宣告。但是,如果你要實作介面中的屬性與函數,就需要使用「override」關鍵字。 介面只定義了方法的名稱、參數和返回值,沒有方法的具體實現。
在 Kotlin 程式語言中,定義抽象類別需要在「class」關鍵字前面加上「abstract」關鍵字。在抽象類別內,若方法是抽象的,需在「fun」前面加上「abstract」。值得留意的是,抽象類別無法直接被實體化,只能被其他類別繼承並實作其中的抽象方法。
當今天某個類別,比如說 String,在不能直接修改其程式碼或無法繼承使用的情況下,你可以運用 Kotlin 的擴展功能,來擴展該類別的功能。它允許你擴展現有的類別,而不需修改其原始碼。這使得你能夠向任何類別添加新的功能,讓程式碼更具靈活性。
可以將「泛型」比喻成寶可夢中的百變怪。它允許你撰寫可以適用於多種資料類型的程式碼,而不需要重複寫多個相似的函數或類別。當你需要處理不同類型的參數,不論是類別或方法,以及各種資料型態時,泛型就能派上用場。
在 Kotlin 程式語言中,類別(Class) 扮演著關鍵角色,它能讓你建立真實存在的物件或實體。類別就像是物件的設計藍圖,描述了它們的特性和行為。而實體化(Instantiation) 則是利用這個藍圖來創造具體的實例,讓物件具備類別所定義的特性和行為。
你可能也想看
Google News 追蹤
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
這章節的目的是介紹 Kotlin 語言中函數的基本用法和概念,包括函數的聲明、使用、參數和返回值等。通過學習這章節,讀者可以熟練掌握如何在 Kotlin 中定義和使用函數,來解決各種問題。
Thumbnail
本章節的目的是介紹 Kotlin 的各種資料型別。包括內建型別如基本數值型別、字串型別和布林型別等,以及如何進行型別轉換。此外,也介紹了如何定義自訂型別(類)和元組型別,以及 Kotlin 提供的集合型別,例如列表(List)、集合(Set)和映射(Map)以及陣列(Array)。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
本文將介紹 Python 中的閉包(Closure),我們將從閉包的定義開始介紹,然後是閉包的用途,以及最後的實作範例。
Thumbnail
大家好,我是woody,是一名料理創作者,非常努力地在嘗試將複雜的料理簡單化,讓大家也可以體驗到料理的樂趣而我也非常享受料理的過程,今天想跟大家聊聊,除了料理本身,料理創作背後的成本。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
本章節的目的是介紹 Kotlin 中的物件導向概念。這包括了類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda 表達式、泛型以及反射等概念。每一個概念都會透過範例程式碼來解釋其功能和用法。
Thumbnail
這章節的目的是介紹 Kotlin 語言中函數的基本用法和概念,包括函數的聲明、使用、參數和返回值等。通過學習這章節,讀者可以熟練掌握如何在 Kotlin 中定義和使用函數,來解決各種問題。
Thumbnail
本章節的目的是介紹 Kotlin 的各種資料型別。包括內建型別如基本數值型別、字串型別和布林型別等,以及如何進行型別轉換。此外,也介紹了如何定義自訂型別(類)和元組型別,以及 Kotlin 提供的集合型別,例如列表(List)、集合(Set)和映射(Map)以及陣列(Array)。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節旨在介紹JavaScript中的物件導向編程。內容包括類別(Class)的定義和使用,建構子的作用,以及公開,私有,受保護(Protected)等不同訪問修飾符的概念。此外,還涵蓋了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型、反射等物件導向的主要觀念。
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
物件導向設計的一個重點就是封裝,這有很多層面上的意義,但基本上就是控制物件的成員變數和方法的存取權。物件導向的封裝還跟繼承機制有關,這使得有一些時候我們逼不得已必須把函式定義在類別上,這種做法使得物件的功能變得難以拆解。封裝應該是模組的職責,並不需要再給物件相同的能力。 一般的模組系統就是把相
Thumbnail
本文將介紹 Python 中的閉包(Closure),我們將從閉包的定義開始介紹,然後是閉包的用途,以及最後的實作範例。