Урок 5. Контракты и полиморфизм
Контракт — список методов, которые должна уметь структура. Структура заявляет контракт через двоеточие, а компилятор проверяет, что все методы есть и сигнатуры совпадают.
Один код — разные реализации
Функция принимает контракт как тип параметра и работает с любой подходящей структурой:
контракт Печатаемый
функция напечатать(): текст;
конец
структура Кот : Печатаемый
функция напечатать(): текст
вернуть "Мяу";
конец
конец
структура Собака : Печатаемый
функция напечатать(): текст
вернуть "Гав";
конец
конец
функция озвучить(Печатаемый существо): целое
вывести(существо.напечатать());
вернуть 0;
конец
функция главная(): целое
Кот кот = Кот();
Собака пёс = Собака();
озвучить(кот);
озвучить(пёс);
вернуть 0;
конец
Мяу
Гав
Выбор реализации происходит во время выполнения. Важная деталь: объект нужно сначала сохранить в переменную. Вызов вида озвучить(Кот()) не работает.
Коллекция разных объектов
Через контракт можно хранить в одном списке разные структуры:
контракт Фигура
функция площадь(): целое;
функция название(): текст;
конец
структура Квадрат : Фигура
целое сторона;
функция площадь(): целое
вернуть это.сторона * это.сторона;
конец
функция название(): текст
вернуть "квадрат";
конец
конец
структура Прямоугольник : Фигура
целое ширина;
целое высота;
функция площадь(): целое
вернуть это.ширина * это.высота;
конец
функция название(): текст
вернуть "прямоугольник";
конец
конец
функция главная(): целое
Список из Фигура фигуры = Список из Фигура();
Квадрат к = Квадрат(3);
Прямоугольник р = Прямоугольник(2, 5);
фигуры.добавить(к);
фигуры.добавить(р);
целое всего = 0;
для каждого ф в фигуры
вывести("%(ф.название())%: %(ф.площадь())%");
всего = всего + ф.площадь();
конец
вывести("Общая площадь: %всего%");
вернуть 0;
конец
квадрат: 9
прямоугольник: 10
Общая площадь: 19
Список контрактов можно обходить циклом для каждого (или пока с получить(индекс)). Исходные переменные (к, р) держите живыми, пока жив список.
Упражнения
- Добавьте структуру
Круг(целочисленный радиус, площадь считайте приближённо3 * r * r). - Сделайте контракт
Животноес методамиимя()иголос()и список из трёх животных.
Дальше: Урок 6. Свой веб-сервер.