Kotlin Sealed類
密封(Sealed
)類是一個限制類層次結構的類。 可以在類名之前使用sealed
關鍵字將類聲明爲密封類。 它用於表示受限制的類層次結構。
當對象具有來自有限集的類型之一,但不能具有任何其他類型時,使用密封類。
密封類的構造函數在默認情況下是私有的,它也不能允許聲明爲非私有。
密封類聲明
sealed class MyClass
密封類的子類必須在密封類的同一文件中聲明。
sealed class Shape{
class Circle(var radius: Float): Shape()
class Square(var length: Int): Shape()
class Rectangle(var length: Int, var breadth: Int): Shape()
object NotAShape : Shape()
}
密封類通過僅在編譯時限制類型集來確保類型安全的重要性。
sealed class A{
class B : A()
{
class E : A() //this works.
}
class C : A()
init {
println("sealed class A")
}
}
class D : A() // this works
{
class F: A() // 不起作用,因爲密封類在另一個範圍內定義。
}
密封類隱式是一個無法實例化的抽象類。
sealed class MyClass
fun main(args: Array<String>)
{
var myClass = MyClass() // 編譯器錯誤,密封類型無法實例化。
}
密封類和 when 的使用
密封類通常與表達時一起使用。 由於密封類的子類將自身類型作爲一種情況。 因此,密封類中的when
表達式涵蓋所有情況,從而避免使用else
子句。
示例:
sealed class Shape{
class Circle(var radius: Float): Shape()
class Square(var length: Int): Shape()
class Rectangle(var length: Int, var breadth: Int): Shape()
// object NotAShape : Shape()
}
fun eval(e: Shape) =
when (e) {
is Shape.Circle ->println("Circle area is ${3.14*e.radius*e.radius}")
is Shape.Square ->println("Square area is ${e.length*e.length}")
is Shape.Rectangle ->println("Rectagle area is ${e.length*e.breadth}")
//else -> "else case is not require as all case is covered above"
// Shape.NotAShape ->Double.NaN
}
fun main(args: Array<String>) {
var circle = Shape.Circle(5.0f)
var square = Shape.Square(5)
var rectangle = Shape.Rectangle(4,5)
eval(circle)
eval(square)
eval(rectangle)
}
`
執行上面示例代碼,得到以下結果 -
Circle area is 78.5
Square area is 25
Rectagle area is 20