Проверка интерфейса в Kotlin
Оператор is проверяет тип значения во время
выполнения. Для интерфейса выражение obj is Figure
даст true, если объект создан классом,
реализующим Figure.
interface Figure {
fun area(): Double
}
class Disk(private val radius: Double) : Figure {
override fun area(): Double = 3.14 * radius * radius
}
fun main() {
val shape: Figure = Disk(2.0)
println(shape is Disk)
println(shape is Figure)
}
Отрицание записывают как !is. После успешной
проверки is компилятор часто сужает тип переменной
в той же ветке кода, и методы интерфейса можно вызывать
без приведения.
fun describe(value: Any) {
if (value is Figure) {
println(value.area())
}
}
Проверка интерфейса удобна, когда в одной коллекции лежат объекты разных классов, а обрабатывать нужно только те, что подходят под общий контракт.
interface VolumeFigure {
fun volume(): Double
}
fun printAreas(items: List<Any>) {
for (item in items) {
when {
item is Figure -> println(item.area())
item is VolumeFigure -> println(item.volume())
}
}
}
Сделайте интерфейс VolumeFigure, который будет
иметь метод volume и метод surfaceArea.
Сделайте класс Cube, который будет
реализовывать интерфейс VolumeFigure.
Создайте несколько объектов классов, реализующих
интерфейс Figure, и несколько объектов
класса Cube. Запишите их в список
в случайном порядке.
Переберите циклом этот список и выведите
на экран только площади объектов, реализующих
интерфейс Figure.
Переберите циклом тот же список и выведите для плоских фигур их площади, а для объемных - площади их поверхности.