Для объявления интерфейса служит ключевое слово interface, за которым следует имя интерфейса, а затем в фигурных скобках указываются его методы, например:
interface usable
В определении класса, реализующего один или несколько интерфейсов, имена интерфейсов перечисляются в списке наследования через запятую после суперкласса (если таковой имеется), например:
{
bool on_use (human@ user);
}
class unit
{
// свойства и методы класса.
}
class human ;: unit
{
int health;
human ()
{
health = 100;
}
void improve_health (int value)
{
health += value;
if (health>100) health = 100;
}
// другие методы класса...
}
// класс аптечки,
// который может быть использован
// (поддерживает интерфейс usable).
class medkit : unit, usable
{
int value;
// другие свойства класса...
// реализация метода,
// специфичного для аптечки.
bool on_use (human@ user)
{
if @user!=null)
{
if (value>0)
{
user.improve_health(value);
value = 0;
}
}
// другие методы класса...
}
Для интерфейсов тоже предусмотрены дескрипторы и обозначаются они символом @ после имени интерфейса.
Такой дескриптор может ссылаться на любой объект, реализующий данный интерфейс, например:
class medkit: usable
{
// свойства и методы класса...
}
class key : usable
{
// свойства и методы класса...
}
class spray : usable
{
// свойства и методы класса...
}
const int MEDKIT = 0;
const int SPRAY = 1;
const int KEY_RED = 2;
const int KEY_YELLOW = 3;
const int KEY_GREEN = 4;
class superman : warrior
{
// свойства и методы класса...
// инвентарь - массив дескрипторов интерфейса usable.
usable@[] inventory(5);
@inventory[MEDKIT] = medkit;
@inventory[SPRAY] = spray;
@inventory[KEY_RED] = key();
@inventory[KEY_YELLOW] = key();
@inventory[KEY_GREEN] = key();
//...
// используем аптечку по нажатию клавиши M.
if (key_pressed(KEY_M))
{
inventory[MEDKIT].use(this);
}
// ...