クラスを閉じる(Sealed Classes)

1537 ワード

クラスを閉じる(Sealed Classes)は、厳密なクラス構造を表すために使用されます.値は有限なセットの中のタイプのみであり、他のタイプではありません.これは、列挙クラスの拡張に相当します.列挙値のセットのタイプは厳密に制限されていますが、列挙定数は1つの実例のみであり、シールクラスのサブクラスには異なる状態を含む複数のインスタンスがあります.シールクラスを宣言します.classの前にsealed修飾子を付ける必要があります.シールクラスにはサブクラスがありますが、すべてシールクラス宣言の内部にネストする必要があります.
閉じたクラスを使用する主な利点はwhen式であり、else形式を使用する必要はありません.
//     (Sealed Classes)
//  sealed     
sealed class Expr
data 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
}
fun main(args: Array<String>)
{
    var mConst1 = Const(20.0)
    var mConst2 = Const(15.2)
    var mSum = Sum(mConst1,mConst2)
    println(eval(mConst1))
    println(eval(mConst2))
    println(eval(mSum))
}

出力:
20.0
15.2
35.2