Kotlin: Наследование классов и перечислений

Наследование позволяет создавать новые классы (классы-наследники), полностью наследующие свойства (переменные), функции и конструкторы родительского класса. Рассмотрим наследование на примере, используя класс MainProvider (предполагается, что класс MainProvider и класс User определены ранее).

Наследование классов

Создадим класс NewClass, наследующий от MainProvider. Перед словом class используется ключевое слово open:

open class NewClass : MainProvider() {
    // ...
}

Теперь можно создавать объекты NewClass. Результат выполнения программы будет таким же, как и ранее, поскольку NewClass наследует всё от MainProvider.

Переопределение членов класса

В NewClass можно переопределять переменные и функции родительского класса. Переопределим переменную info:

override var info: String = "Новый текст"

Ключевое слово override указывает на переопределение. Доступ к значению по умолчанию из родительского класса осуществляется через super.info.

Переопределим функцию printInfo:

override fun printInfo(user: User) {
    super.printInfo(user)
    println("Текст из класса-наследника")
}

Переопределённая функция сначала вызывает функцию родительского класса (super.printInfo), затем добавляет собственный код.

Модификаторы доступа

Для доступа к переменным из класса-наследника в родительском классе необходимо использовать модификатор доступа open. Например, если переменная db в MainProvider объявлена как:

open val db: String = "be connected"

то в NewClass её можно переопределить:

override var db: String = "baby connected"

Без open доступ из класса-наследника будет невозможен. Модификатор protected ограничивает доступ к переменной внутри класса и его наследников.

Создание класса-наследника при создании объекта

Класс-наследник можно создавать непосредственно при создании объекта:

val user = object : MainProvider() {
    override fun printInfo(user: User) {
        // ... переопределённая функция
    }
}

Это позволяет переопределять функции и переменные без создания отдельного файла для класса-наследника.

Перечисления (Enums)

Перечисление – это список возможных вариантов. Создадим перечисление Animals:

enum class Animals {
    DOG, CAT, BEAR, LION
}

Создадим переменную и присвоим ей значение из перечисления:

val animal = Animals.BEAR

Проверка значения выполняется с помощью оператора when:

when (animal) {
    Animals.CAT -> println("Кошка")
    Animals.BEAR -> println("Медведь")
    else -> println("Что-то другое")
}

Функции в перечислениях

В перечисление можно добавлять функции:

enum class Animals {
    DOG, CAT, BEAR, LION;

    val toLowercase: String
        get() = name.lowercase()

    val toCapitalized: String
        get() = name.replaceFirstChar { it.uppercase() }
}

К ним можно обращаться через точку:

println(animal.toLowercase) // Выведет "bear"
println(animal.toCapitalized) // Выведет "Bear"

Kotlin предоставляет более функциональные перечисления, чем Java, позволяя добавлять функции непосредственно в определение.

Рассмотрены наследование классов и перечисления в Kotlin. Наследование позволяет создавать новые классы на основе существующих, переопределяя их свойства и методы. Перечисления обеспечивают удобный способ работы с предопределенным набором значений и позволяют добавлять дополнительные функции.

Что будем искать? Например,программа