<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## [密封類](http://www.hmoore.net/alex_wsc/android_kotlin/1318307) 密封類用于表示受限制的類層次結構,當一個值只能在一個集合中取值,而不能取其他值時,此時可以使用密封類。在某種意義上,密封類是枚舉類的擴展,即枚舉類型的值集合。每個枚舉常量只存在一個實例,而密封類的一個子類可以有可包含狀態的多個實例。如果想要創建一個密封類必須滿足以下兩個條件。 (1)密封類必須用sealed關鍵字來修飾。 (2)由于密封類的構造函數是私有的,因此密封類的子類只能定義在密封類的內部或者同一個文件中(密封類子類的子類(間接繼承者)可以放在任何位置,無需在同一個文件中!)。 示例講解密封類 ``` 1 sealed class Stark { 2 // 羅伯?斯塔克 3 class RobStark : Stark(){} 4 // 珊莎?斯塔克 5 class SansaStark : Stark(){} 6 // 艾麗婭?斯塔克 7 class AryaStark : Stark(){} 8 // 布蘭登?斯塔克 9 class BrandonStark(){} 10 } 11 // 瓊恩?雪諾 12 class JonSnow : Stark(){} ``` 上述代碼中,定義了一個密封類Stark,并在該類的內部定義了3個子類,分別是RobStark類、SansaStark類以及AryaStark類。BrandonStark類是該密封類的嵌套類,由于密封類的子類可以不在該密封類中,但是必須與密封類在同一個文件中,因此可知JonSnow類也是該密封類的子類。 >[info]需要注意的是,密封類的非直接繼承子類(密封類子類的子類)可以聲明在其他文件中。 ### 和普通繼承類的區別 * 我們知道普通的繼承類使用`open`關鍵字定義,在項目中的類都可集成至該類。 * 而密封類的子類必須是在密封類的內部或必須存在于密封類的同一文件。這一點就是上面提到的有效的代碼保護。 ### Kotlin中密封類與枚舉類的區別 密封類適用于子類可數的情況,而枚舉類適用于實例可數的情況。 示例 ``` sealed class SealedExpr{ data class Person(val name : String, val age : Int) : SealedExpr() object Add : SealedExpr() // 單例模式 object Minus : SealedExpr() // 單例模式 } // 其子類可以定在密封類外部,但是必須在同一文件中 v1.1之前只能定義在密封類內部 object NotANumber : SealedExpr() fun main(args:Array<String>){ val mPerson1 = SealedExpr.Person("張三",22) println(mPerson1) val mPerson2 = SealedExpr.Person("李四",23) println(mPerson2) println(mPerson1.hashCode()) println(mPerson2.hashCode()) } ``` 運行結果 ``` Person(name=張三, age=22) Person(name=李四, age=23) 24021581 26103914 ``` ### 密封類的子類擴展 下面的擴展功能沒有任何的意義,只是為了給大家展示密封類子類的擴展不局限與密封類同文件這一個功能而已 示例 ``` // 其存在于SealedClassDemo.kt文件中 sealed class SealedExpr{ data class Person(val name : String, val age : Int) : SealedExpr() object Add : SealedExpr() companion object Minus : SealedExpr() } object NotANumber : SealedExpr() //其存在TestSealedDemo.kt文件中 fun <T>SealedExpr.Add.add(num1 : T, num2 : T) : Int{ return 100 } fun main(args: Array<String>) { println(SealedExpr.Add.add(1,2)) } ``` 運行結果 ``` 100 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看