Котлин Запечатанный Класс
В этом уроке мы рассмотрим Kotlin Sealed Class. Кто они такие? Какова их польза? Мы рассмотрим все эти вещи ниже.
Котлин Запечатанный Класс
Реализация запечатанных классов Kotlin
Запечатанные классы в Kotlin реализованы следующим образом.
sealed class A{
class B : A()
class C : A()
}
Чтобы указать запечатанный класс, вам нужно добавить модификатор sealed
. Запечатанный класс не может быть создан. Следовательно, являются неявно абстрактными. Следующее НЕ РАБОТАЕТ.
fun main(args: Array<String>)
{
var a = A() //compiler error. Class A cannot be instantiated.
}
Конструкторы закрытого класса по умолчанию закрыты. Все подклассы закрытого класса должны быть объявлены в одном и том же файле. Закрытые классы важны для обеспечения безопасности типов, ограничивая набор типов только во время компиляции.
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. Since sealed class is defined in another scope.
}
Создание закрытого класса с конструкторами.
sealed class A(var name: String){
class B : A("B")
class C : A("C")
}
class D : A("D")
fun main(args: Array<String>) {
var b = A.B()
var d = D()
}
Добавление объекта в закрытый класс.
fun main(args: Array<String>) {
val e = A.E("Anupam")
println(e) //prints E(name=Anupam)
var d = A.D
d.name() //prints Object D
}
sealed class A{
class B : A()
class C : A()
object D : A()
{
fun name()
{
println("Object D")
}
}
data class E(var name: String) : A()
}
Разница между перечислением и запечатанными классами
В Kotlin классы Sealed можно назвать классами Enum на стероидах. Запечатанные классы позволяют нам создавать экземпляры с разными типами, в отличие от Enum, которые ограничивают нас использованием одного и того же типа для всех констант перечисления. Следующее невозможно в классах Enum.
enum class Months(string: String){
January("Jan"), February(2),
}
Классы Enum допускают только один тип для всех констант. Вот где нам на помощь приходят запечатанные классы, допускающие несколько экземпляров.
sealed class Months {
class January(var shortHand: String) : Months()
class February(var number: Int) : Months()
class March(var shortHand: String, var number: Int) : Months()
}
Как вы можете использовать эту функцию классов Sealed в своих проектах? В приложении, похожем на ленту новостей, вы можете создать три разных типа классов для постов «Статус», «Изображение» и «Видео», как показано ниже.
sealed class Post
{
class Status(var text: String) : Post()
class Image(var url: String, var caption: String) : Post()
class Video(var url: String, var timeDuration: Int, var encoding: String): Post()
}
Это невозможно с классами Enum.
Запечатанные классы и когда
Запечатанные классы обычно используются с инструкциями when
, поскольку каждый из подклассов и их типов действуют как случай. Более того, мы знаем, что класс Sealed ограничивает типы. Следовательно, часть else
оператора when
можно легко удалить. Следующий пример демонстрирует то же самое.
sealed class Shape{
class Circle(var radius: Float): Shape()
class Square(var length: Int): Shape()
class Rectangle(var length: Int, var breadth: Int): 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}")
}
Давайте выполним функцию eval
в нашей функции main
, как показано ниже.
fun main(args: Array<String>) {
var circle = Shape.Circle(4.5f)
var square = Shape.Square(4)
var rectangle = Shape.Rectangle(4,5)
eval(circle)
eval(square)
eval(rectangle)
//eval(x) //compile-time error.
}
//Following is printed on the console:
//Circle area is 63.585
//Square area is 16
//Rectangle area is 20
Примечание. Модификатор is
проверяет, относится ли класс к следующему типу. Модификатор is
требуется только для классов. Не с объектами Kotlin, как показано ниже:
sealed class Shape{
class Circle(var radius: Float): Shape()
class Square(var length: Int): Shape()
object Rectangle: Shape()
{
var length: Int = 0
var breadth : Int = 0
}
}
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}")
Shape.Rectangle -> println("Rectangle area is ${Shape.Rectangle.length*Shape.Rectangle.breadth}")
}
На этом учебник по закрытому классу kotlin заканчивается. Ссылки: Kotlin Документы