【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )
文章目錄
- I . 密封類概念
- II . 密封類聲明
- III. 密封類注意事項
- IV . 密封類 示例代碼
I . 密封類概念
1 . 密封類作用 : 定義一個密封類 , 該類只能有有限個指定的子類 , 不能在其它文件定義其它類型子類 ;
2 . 密封類與枚舉類 :
① 相同點 ( 類型限制 ) : 從類型種類角度對比 , 類與枚舉類類似 , 枚舉類的值的集合是受限制的 , 不能隨意擴展 ;
② 不同點 ( 對象個數限制 ) : 從每個類型對象個數對比 , 枚舉類的每個類型只能存在一個實例 , 而密封類的每個類型可以創建無數個實例 ;
II . 密封類聲明
1 . 密封類聲明 : 在 class 前添加 sealed 修飾符 , 即可將該類聲明為密封類 ;
sealed class Student{}2 . 子類聲明 : 密封類的子類 , 必須定義在密封類的內部 ; ( 1.1 之后的版本可以定義在同一個文件中 )
sealed class Student {class GoodStudent : Student() }為了版本兼容 , 還是定義在密封類內部吧 ;
III. 密封類注意事項
1 . 抽象類本質 : 密封類本質是抽象類 , 其類型不能被實例化 , 只能實例化其子類 ;
2 . 私有構造函數 : 密封類的構造函數默認是 private 私有的 , 其構造函數必須是私有的 , 不允許非私有構造函數存在 ;
3 . 密封類子類 :
① 定義在密封類內部 ( 推薦 ) : 密封類的子類建議定義在密封類內部 , 可以兼容所有版本 ;
② 定義在密封類所在文件 : Kotlin 1.1 以后的版本 , 可以將密封類子類定義在密封類聲明的同一個文件中 ;
4 . 密封類孫子類 : 密封類子類也可以被繼承 , 其孫子類沒有繼承限制 , 可以在其它類中繼承定義 ;
5 . when 語句 : 在 when 語句中判定 , 必須有 else 其它情況進行兜底 , 但是判定密封類子類時 , 如果 when 中列舉了所有的密封類子類 , 此時可以不寫 else 分支 , 詳情看下面的示例代碼 ;
IV . 密封類 示例代碼
package sealedsealed class Student {/*** 注意 : 只有被 open 修飾的函數才能被 override 重寫*/open fun study(){println("學習")}/*** 子類 1*/class GoodStudent : Student(){override fun study() {println("學習很好")}fun read(){println("讀書")}}/*** 子類 2*/class NormalStudent : Student(){override fun study() {println("學習一般")}fun seat(){println("靜坐")}}/*** 子類 3*/class BadStudent : Student(){override fun study() {println("學的很渣")}fun play(){println("打游戲")}}}fun main() {// 1 . 測試密封類子類 1var goodStudent : Student.GoodStudent = Student.GoodStudent()//學習很好goodStudent.study()//讀書studentAction(goodStudent)//2 . 測試密封類子類 2var normalStudent : Student.NormalStudent = Student.NormalStudent()//學習一般normalStudent.study()//靜坐studentAction(normalStudent)//3 . 測試密封類子類 3var badStudent : Student.BadStudent = Student.BadStudent()//學的很渣badStudent.study()//打游戲studentAction(badStudent)}/*** 根據不同的類型執行不同的方法*/ fun studentAction(student : Student) = when(student){//如果已經覆蓋了 3 個子類 , 即所有的情況 , 此時可以不需要定義 else 語句is Student.GoodStudent -> student.read()is Student.BadStudent -> student.play()is Student.NormalStudent -> student.seat()//else -> println("其它情況") }
執行結果 :
學習很好 讀書 學習一般 靜坐 學的很渣 打游戲總結
以上是生活随笔為你收集整理的【Kotlin】Kotlin Sealed 密封类 ( 密封类声明 | 密封类子类定义 | 密封类特点 | 代码示例 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Kotlin】Kotlin 单例 (
- 下一篇: 【Kotlin】Kotlin enum