Общий код в абстрактном классе Kotlin
Абстрактный класс не обязан состоять только из абстрактных методов. В одном типе удобно держать и общий код с реализацией, и объявления без тела, которые потомки должны дописать сами.
Общие поля и методы родителя наследуются как у обычного класса. Абстрактные члены задают, что именно каждый потомок обязан реализовать:
abstract class User {
private var name: String = ""
fun getName(): String = name
fun setName(name: String) {
this.name = name
}
fun printName() {
println(getName())
}
abstract fun increaseRevenue(value: Int)
}
Метод printName уже имеет тело - его не переопределяют
в Employee и Student, а просто вызывают. Метод
increaseRevenue в каждом потомке свой:
class Employee : User() {
private var salary: Int = 0
override fun increaseRevenue(value: Int) {
salary += value
}
fun getSalary(): Int = salary
}
class Student : User() {
private var scholarship: Int = 0
override fun increaseRevenue(value: Int) {
scholarship += value
}
}
В абстрактном классе допустимы приватные вспомогательные методы - их видят только методы того же класса, потомки к ним не обращаются снаружи, но могут пользоваться публичной логикой родителя:
abstract class User {
private var name: String = ""
protected fun isNotEmpty(text: String): Boolean {
return text.isNotEmpty()
}
fun setName(name: String) {
if (isNotEmpty(name)) {
this.name = name
}
}
fun getName(): String = name
abstract fun roleLabel(): String
}
class Employee : User() {
override fun roleLabel(): String = "employee"
}
Модификатор protected у метода родителя позволяет вызывать
его из тела потомка, но не из произвольного кода снаружи класса.
Сделайте абстрактный класс Figure
с методом describe, который выводит
на экран площадь и периметр фигуры.
Сделайте свойства area и
perimeter абстрактными.
Реализуйте класс Circle.