Sealed Class

https://kotlinlang.org/docs/sealed-classes.html

sealed class

Ограничивает возможность наследования от него, позволяя наследоваться только в пределах того же файла или модуля, где он был объявлен. Это дает возможность разработчику контролировать все возможные подтипы данного класса, улучшая поддержку безопасных и предсказуемых конструкций кода.

• Все наследники известны в compile time. Наследование sealed-классов или интерфейсов из разных модулей запрещено. IDE отобразит ошибку.

• Не можем быть создан напрямую, может быть только предком.

• Нельзя присвоить анонимному классу, так как это вычисляется в run time.

• Не могут быть open inner.

• Модификатор abstract является избыточным, поскольку класс sealed может иметь абстрактные компоненты.

• Можно использовать sealed interface вместо класса если не нужно передавать параметры в конструктор.

• Под капотом в java - abstract class.

sealed class Result {
    data class Success(val data: String) : Result()
    data class Error(val exception: Exception) : Result()
    object Loading : Result()
}

sealed interface

Ограничивает количество возможных реализаций, и все они должны быть либо в том же файле, либо в том же модуле, где объявлен интерфейс. Это позволяет разработчику контролировать набор реализаций интерфейса и гарантировать, что никаких неожиданных реализаций добавлено не будет.

sealed interface Shape {
    fun area(): Double
}

class Circle(private val radius: Double) : Shape {
    override fun area(): Double = Math.PI * radius * radius
}

class Rectangle(private val width: Double, private val height: Double) : Shape {
    override fun area(): Double = width * height
}

class Triangle(private val base: Double, private val height: Double) : Shape {
    override fun area(): Double = 0.5 * base * height
}

Разница между sealed class и enum class?

sealed class позволяет создавать иерархии с ограниченным набором подклассов и поддерживает наследование, тогда как enum class представляет фиксированный набор констант и не поддерживает наследование.

Разница между sealed class и abstract class?

sealed class ограничивает наследование только подклассами, определёнными в том же файле, и используется для моделирования замкнутых иерархий типов.
abstract class позволяет наследоваться без ограничений и предоставляет общие абстрактные методы для реализации в подклассах.

Разница между sealed interface и interface?

sealed interface ограничивает набор классов, которые могут реализовать этот интерфейс, обеспечивая контроль над всеми реализациями на этапе компиляции. Это позволяет, например, более строго управлять обработкой различных реализаций. В то время как обычный interface не ограничивает количество классов, которые могут его реализовать, что может привести к неожиданным или неуправляемым реализациям.

Разница между sealed class и sealed interface?

sealed class может иметь поля, которые доступны в его подклассах. sealed interface не может содержать поля, только методы.
sealed interface может быть более гибким в некоторых случаях, позволяя интерфейсам определять ограничения, которые могут быть реализованы различными классами, тогда как sealed class имеет более строгую иерархию.

Kotlin Sealed Class. Вопросы на собесе
  1. Какие преимущества у использования sealed class?
  1. Какие ограничения наследования есть у sealed class?
  1. Разница между sealed class и enum?
  1. Разница между sealed class и sealed interface?
  1. Разница между sealed interface и interface?
  1. Разница между sealed class и sealed interface?
  1. Как sealed class выглядит под капотом в Java?

    Как abstract class.