На этом шаге мы рассмотрим объявление интерфейса.
Чтобы определить, как должно протекать сражение, создадим интерфейс, перечисляющий функции и свойства игровых сущностей, могущих участвовать в схватках. Игрок будет сражаться с гоблинами, но наша система боя будет применима к любым противникам, а не только к гоблинам.
Создайте новый файл с именем Creature.kt в пакете com.bignerdranch.nyethack (этот прием помогает избежать коллизии имен) и, используя ключевое слово interface, объявите интерфейс Fightable.
package com.bignerdranch.nyethack interface Fightable { var healthPoints: Int val diceCount: Int val diceSides: Int val damageRoll: Int fun attack(opponent: Fightable): Int }
Рис.1. Объявление интерфейса (Creature.kt)
Этот интерфейс определяет общие черты сущностей, которые могут принимать участие в схватках в игре в NyetHack. Существа, способные сражаться, используют несколько игральных костей с несколькими гранями, чтобы определить величину ущерба - сумму очков, выпавших на всех игральных костях, - нанесенного противнику. Такие существа также должны иметь очки здоровья healthPoints и реализовать функцию attack().
Четыре свойства Fightable нигде не инициализируются, а функция attack() не имеет тела. Интерфейс не предоставляет инициализаторов или тел функции. Запомните: интерфейс - это что, а не как.
Обратите внимание, что интерфейс Fightable используется как тип параметра opponent, который принимает функция attack(). Интерфейс, как и класс, можно использовать как тип параметра.
Для функции, указывающей тип параметра, важно, что аргумент может делать, а не как его поведение реализовано. Это одна из сильных сторон интерфейса: можно определить набор требований, общих для классов, которые в остальном не имеют ничего общего.
На следующем шаге мы рассмотрим реализацию интерфейса.