Поиск по сайту:

Котлин Запечатанный Класс


В этом уроке мы рассмотрим 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 Документы