29. Интерфейсы

Для объявления интерфейса служит ключевое слово 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);
}
// ...

Назад | Содержание | Вперёд

Поделитесь с друзьями

WordPress Lessons