Конструктор абстрактного класса в Kotlin
Абстрактный класс может иметь первичный конструктор с параметрами.
Общие данные инициализируют в родителе, а потомок передаёт значения
через super или список параметров после имени своего класса.
Имя пользователя зададим в конструкторе абстрактного User:
abstract class User(protected var name: String) {
fun getName(): String = name
fun setName(name: String) {
this.name = name
}
abstract fun increaseRevenue(value: Int)
}
Класс Employee принимает имя и зарплату, имя передаёт
в конструктор родителя:
class Employee(
name: String,
private var salary: Int
) : User(name) {
fun getSalary(): Int = salary
fun setSalary(salary: Int) {
this.salary = salary
}
override fun increaseRevenue(value: Int) {
salary += value
}
}
При создании объекта вызывается цепочка конструкторов - сначала
родитель получает name, затем инициализируются поля
потомка:
fun main() {
val employee = Employee("john", 1000)
println(employee.getName())
println(employee.getSalary())
}
В абстрактном классе допустим блок init - он выполнится
при создании любого конкретного потомка после инициализации
параметров конструктора:
abstract class User(protected var name: String) {
init {
require(name.isNotEmpty()) { "name must not be empty" }
}
abstract fun increaseRevenue(value: Int)
}
Если потомок объявляет свой первичный конструктор, параметры родителя перечисляют в заголовке наследования после двоеточия:
class Student(
name: String,
private var scholarship: Int
) : User(name) {
override fun increaseRevenue(value: Int) {
scholarship += value
}
fun getScholarship(): Int = scholarship
}
Сделайте абстрактный класс User
с конструктором, принимающим имя пользователя.
Сделайте класс Employee с конструктором,
принимающим имя и зарплату, и передайте имя
в конструктор родительского класса.
Сделайте класс Student с конструктором,
принимающим имя и стипендию. Передайте имя
в конструктор родительского класса и напишите
реализацию абстрактного метода
increaseRevenue.