Kotlin学習の道--Sealed class類の詳細
3272 ワード
前回のKotlin学習の道–オブジェクト向けにKotlinクラスとインタフェースの使い方を紹介しました.これらのクラスの使い方はJavaと似たような概念がありますが、今日はKotlinのSealedクラス(密封クラス)を紹介します.これはJavaにはない概念です. Sealed class(シーリングクラス)は、特定の数のサブクラスを持つクラスであり、列挙と少し似ているように見えますが、列挙では、各タイプに1つのオブジェクト(インスタンス)しかありません.一方、シールクラスでは、同じクラスに複数のオブジェクトを持つことができます. Sealed class(シールクラス)のすべてのサブクラスは、シールクラスと同じファイルにある でなければならない. Sealed class(シーリングクラス)のサブクラスのサブクラスはどこでも定義でき、シーリングクラスと同じファイルに を定義する必要はありません. Sealed class(シールクラス)は構造関数がなく、直接インスタンス化することはできず、内部のサブクラス のみをインスタンス化することができる.
Sealed class使用シーン1
まずシール類を書きます
このときSealedClassのHelloメソッドを呼び出すにはどうすればいいですか?
正しい使用姿勢:
Sealed class使用シーン2
前一篇Kotlin学习的路–向对象次篇Kotlin学习的路–代理模式
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学习的路–代理模式