Sealed (Запечатанный) класс в Kotlin — это класс, который ограничивает иерархию классов. Класс может быть объявлен как запечатанный класс, используя ключевое слово «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 класс обеспечивает безопасность типов, ограничивая набор типов только во время компиляции.
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() //This won't work,because sealed class is defined in another scope.
}
Запечатанный класс неявно является абстрактным классом, который не может быть создан.
sealed class MyClass
fun main(args: Array)
{
var myClass = MyClass() //compiler error. sealed types cannot be instantiated.
}
Запечатанный класс с when
Sealed классы обычно используются с выражением 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) {
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
