Классы. Интерфейсы
Интерфейс позволяет перечислить общие свойства и поведение набора классов без их реализации. Эта особенность — что без как — полезна, если наследование не точно отражает отношения между классами в программе.
Используя интерфейсы, группа классов может иметь общие свойства и функции, не наследуя общий суперкласс и не являясь подклассами друг друга.
interface Fightable { var healthPoints: Int val diceCount: Int val diceSides: Int val damageRoll: Int fun attack(opponent: Fightable): Int }
Четыре свойства Fightable нигде не инициализируются, а функция attack не имеет тела. Интерфейс не предоставляет инициализаторов или тел функции. Запомните: интерфейс — это что, а не как.
Обратите внимание, что интерфейс Fightable используется как тип параметра opponent, который принимает функция attack. Интерфейс, как и класс, можно использовать как тип параметра.
Для функции, указывающей тип параметра, важно, что аргумент может делать, а не как его поведение реализовано. Это одна из сильных сторон интерфейса: можно определить набор требований, общих для классов, которые в остальном не имеют ничего общего.
Преимущество перечислений:
-ограниченнее количество
-нет возможности их расширить (через extend)
Пример:
enum class Cru(val level: Int) { CRU(80), PREMIER(90), GRAND(100); override fun toString() :String { return when(this) { CRU -> "Base Cru" PREMIER -> "Premier Cru" GRAND -> "Grand Cru" } } } fun main () { val cru = Cru.valueOf("PREMIER") Cru.values().forEach { println(it) } println(cru) }