Наследование позволяет создавать новые классы (классы-наследники), полностью наследующие свойства (переменные), функции и конструкторы родительского класса. Рассмотрим наследование на примере, используя класс 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. Наследование позволяет создавать новые классы на основе существующих, переопределяя их свойства и методы. Перечисления обеспечивают удобный способ работы с предопределенным набором значений и позволяют добавлять дополнительные функции.