-
密封類
的關(guān)鍵詞為sealed
- 他是一種特殊的
抽象類
,無法被實(shí)例化拾徙。 - 它的構(gòu)造函數(shù)是
private
的,這將使其只能在同一個(gè)文件中被使用漱办,無法隨意的擴(kuò)展
形导。
sealed class SealedClassSimple(var name: String) { }//密封類定義,默認(rèn)的抽象類砌些,無法被
class SealedClass1(name: String, var age: Int) : SealedClassSimple(name) { // 子類1呜投,可以定義自己的屬性
fun print(): Unit {
System.out.println("in SealedClass1: name=${name} age=${age}")
}
}
class SealedClass2() : SealedClassSimple("doulala") { //子類2
fun print(): Unit {
System.out.println("in SealedClass2 name=${name}")
}
}
fun print(printer: SealedClassSimple) { //打印類
when (printer) {
is SealedClass1 -> printer.print()
is SealedClass2 -> printer.print()
}
}
fun main(args: Array<String>) {
print(SealedClass1("doulala", 18)) //打印 "in SealedClass1: name=doulala age=18 "
print(SealedClass2())//打印 "in SealedClass2 name=doulala"
}
密封類的類型擴(kuò)展
密封類
本身對(duì)外部范圍文件是不可見的,但是其子類是對(duì)外可見的:
File1.kt
open class SealedClass2() : SealedClassSimple("doulala") { //對(duì)外開放的子類
open fun print(): Unit {
System.out.println("in SealedClass2 name=${name}")
}
}
File2.kt
class OuterChildren : SealedClass2() { //定義外部的子類存璃,繼承仑荐,并重寫方法
override fun print(): Unit {
System.out.println("in OuterChildren name=${name}")
}
}
fun print(printer: SealedClassSimple) {
when (printer) {
is SealedClass2 -> printer.print()
is OuterChildren -> printer.print() //OuterChildren也因?yàn)槔^承鏈的原因,屬于SealClassSimple的類型
}
}
fun main(args: Array<String>) {
print(SealedClass2())//打印 "in SealedClass2"
print(OuterChildren()) //打印 "in OuterChildren name=doulala"
}
密封類 vs 枚舉類型
枚舉類型
與密封類
都是為了實(shí)現(xiàn)有限集中的值或者類型密封類
其實(shí)是通過繼承
+private constructor
的組織實(shí)現(xiàn)枚舉類型
是語法支持密封類
可以支持子類的多屬性
與多方法
纵东,這些都是枚舉類型
無法完成的密封類
仍然存在外部擴(kuò)展的可能性粘招,可以通過對(duì)子類的繼承,完成對(duì)類型的擴(kuò)展偎球。(其實(shí)就是繼承玩的6)