Абстрактные свойства в Kotlin
Кроме методов, в абстрактном классе можно объявить абстрактное
свойство. У него нет инициализатора в родителе - только имя
и тип. Конкретный потомок обязан определить свойство и указать
override.
Абстрактное свойство в объявлении класса выглядит так:
abstract class Figure {
abstract val area: Double
abstract val perimeter: Double
}
В Circle радиус хранят в конструкторе, а площадь и
периметр считают в переопределённых свойствах:
class Circle(private val radius: Double) : Figure() {
override val area: Double
get() = Math.PI * radius * radius
override val perimeter: Double
get() = 2 * Math.PI * radius
}
У Rectangle задают ширину и высоту, формулы те же - через
геттеры:
class Rectangle(
private val width: Double,
private val height: Double
) : Figure() {
override val area: Double
get() = width * height
override val perimeter: Double
get() = 2 * (width + height)
}
Абстрактным может быть и свойство с изменяемым значением -
тогда в родителе пишут abstract var, а в потомке
реализуют и геттер, и сеттер при необходимости:
abstract class Counter {
abstract var count: Int
}
class SimpleCounter : Counter() {
override var count: Int = 0
}
Сделайте абстрактный класс Figure
с абстрактными свойствами area
и perimeter. Сделайте класс
Square, принимающий длину стороны
в конструкторе, и реализуйте в нем оба
абстрактных свойства.