Урок 5. Контракты и полиморфизм

Контракт — список методов, которые должна уметь структура. Структура заявляет контракт через двоеточие, а компилятор проверяет, что все методы есть и сигнатуры совпадают.

Один код — разные реализации

Функция принимает контракт как тип параметра и работает с любой подходящей структурой:

контракт Печатаемый
    функция напечатать(): текст;
конец

структура Кот : Печатаемый
    функция напечатать(): текст
        вернуть "Мяу";
    конец
конец

структура Собака : Печатаемый
    функция напечатать(): текст
        вернуть "Гав";
    конец
конец

функция озвучить(Печатаемый существо): целое
    вывести(существо.напечатать());
    вернуть 0;
конец

функция главная(): целое
    Кот кот = Кот();
    Собака пёс = Собака();
    озвучить(кот);
    озвучить(пёс);
    вернуть 0;
конец
Мяу
Гав

Выбор реализации происходит во время выполнения. Важная деталь: объект нужно сначала сохранить в переменную. Вызов вида озвучить(Кот()) не работает.

Коллекция разных объектов

Через контракт можно хранить в одном списке разные структуры:

контракт Фигура
    функция площадь(): целое;
    функция название(): текст;
конец

структура Квадрат : Фигура
    целое сторона;
    функция площадь(): целое
        вернуть это.сторона * это.сторона;
    конец
    функция название(): текст
        вернуть "квадрат";
    конец
конец

структура Прямоугольник : Фигура
    целое ширина;
    целое высота;
    функция площадь(): целое
        вернуть это.ширина * это.высота;
    конец
    функция название(): текст
        вернуть "прямоугольник";
    конец
конец

функция главная(): целое
    Список из Фигура фигуры = Список из Фигура();
    Квадрат к = Квадрат(3);
    Прямоугольник р = Прямоугольник(2, 5);
    фигуры.добавить(к);
    фигуры.добавить(р);

    целое всего = 0;
    для каждого ф в фигуры
        вывести("%(ф.название())%: %(ф.площадь())%");
        всего = всего + ф.площадь();
    конец
    вывести("Общая площадь: %всего%");
    вернуть 0;
конец
квадрат: 9
прямоугольник: 10
Общая площадь: 19

Список контрактов можно обходить циклом для каждого (или пока с получить(индекс)). Исходные переменные (к, р) держите живыми, пока жив список.

Упражнения

  1. Добавьте структуру Круг (целочисленный радиус, площадь считайте приближённо 3 * r * r).
  2. Сделайте контракт Животное с методами имя() и голос() и список из трёх животных.

Дальше: Урок 6. Свой веб-сервер.