Kotlin学習の道--Sealed class類の詳細

3272 ワード

前回のKotlin学習の道–オブジェクト向けにKotlinクラスとインタフェースの使い方を紹介しました.これらのクラスの使い方はJavaと似たような概念がありますが、今日はKotlinのSealedクラス(密封クラス)を紹介します.これはJavaにはない概念です.
  • Sealed class(シーリングクラス)は、特定の数のサブクラスを持つクラスであり、列挙と少し似ているように見えますが、列挙では、各タイプに1つのオブジェクト(インスタンス)しかありません.一方、シールクラスでは、同じクラスに複数のオブジェクトを持つことができます.
  • Sealed class(シールクラス)のすべてのサブクラスは、シールクラスと同じファイルにある
  • でなければならない.
  • Sealed class(シーリングクラス)のサブクラスのサブクラスはどこでも定義でき、シーリングクラスと同じファイルに
  • を定義する必要はありません.
  • Sealed class(シールクラス)は構造関数がなく、直接インスタンス化することはできず、内部のサブクラス
  • のみをインスタンス化することができる.
    Sealed class使用シーン1
    まずシール類を書きます
    sealed class SealedClass{
        class SealedClass1():SealedClass()
        class SealedClass2():SealedClass()
        fun hello(){
            println("Hello World ... ")
        }
    }

    このときSealedClassのHelloメソッドを呼び出すにはどうすればいいですか?
    fun main(args:Array<String>){
        var sc:SealedClass = SealedClass()//        
    }

    正しい使用姿勢:
    fun main(args:Array<String>){
        var sc:SealedClass = SealedClass.SealedClass1()//                 ,             
        sc.hello()
    }

    Sealed class使用シーン2
    sealed class Mathematics(){
        data class Dou(val number: Double) : Mathematics()
        data class Sub(val e1: Mathematics, val e2: Mathematics) : Mathematics()
        object NotANumber : Mathematics()
    
        fun eval(m: Mathematics): Double = when(m) {
            is Dou -> {
                m.number
            }
            is Sub -> eval(m.e1) - eval(m.e2)
            NotANumber -> Double.NaN
        }
    }
    
    fun main(args:Array<String>){
        var ec1:Mathematics = Mathematics.Dou(5.0)
        var d1 = ec1.eval(ec1)
        println(d1)
    
        var ec2:Mathematics = Mathematics.Sub(ec1, Mathematics.Dou(3.0))
        var d2 = ec2.eval(ec2)
        println(d2)
    
        var ec3:Mathematics = Mathematics.NotANumber
        var d3 = ec3.eval(ec3)
        println(d3)
    }
    
        :
    
    5.0
    2.0
    NaN

    前一篇Kotlin学习的路–向对象次篇Kotlin学习的路–代理模式