Menu
Coddy logo textTech

Полиморфное использование

Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 47 из 61.

challenge icon

Задание

Легко

Давайте докажем, что полиморфизм действительно работает, написав функцию, которая может обрабатывать любую фигуру через указатель на базовый тип Shape* — будь то Circle или Rectangle.

Опираясь на ваши существующие реализации Circle и Rectangle, вы добавите мощную абстракцию: одну функцию, которая единообразно работает с любым типом фигуры.

Ваш проект будет включать следующие файлы:

  • shape.h: Ваш базовый интерфейс Shape с типами DrawFunc и AreaFunc.
  • circle.h и circle.c: Ваша реализация Circle из предыдущего урока.
  • rectangle.h и rectangle.c: Ваша реализация Rectangle из предыдущего урока.
  • shape.c: Реализуйте новую функцию с именем process_shape, которая принимает указатель Shape*. Эта функция должна вызывать функцию draw фигуры, затем вызывать её функцию area и выводить результат с 2 знаками после запятой в формате Area: X.XX.
  • main.c: Продемонстрируйте полиморфизм в действии. Считайте индикатор типа фигуры (c для круга, r для прямоугольника), а затем необходимые размеры. Создайте соответствующую фигуру, затем передайте указатель на её встроенный член Shape в функцию process_shape. Одна и та же функция обрабатывает оба типа!

Ваша программа получит либо:

  • c, за которым следует значение радиуса, или
  • r, за которым следуют значения ширины и высоты

Пример вывода, когда входные данные c и 5.0:

Drawing Circle with radius: 5.00
Area: 78.54

Пример вывода, когда входные данные r, 4.0 и 3.0:

Drawing Rectangle with width: 4.00 and height: 3.00
Area: 12.00

Магия здесь заключается в том, что process_shape понятия не имеет, работает ли она с Circle или Rectangle — она знает только об интерфейсе Shape. Приводя встроенный член Shape вашей конкретной фигуры к Shape*, вы можете передать любой тип фигуры в эту единственную функцию. Это и есть полиморфизм: одна функция, множество вариантов поведения в зависимости от фактического типа объекта.

Не забудьте объявить process_shape в shape.h, чтобы её можно было вызвать из main.c.

Попробуйте сами

#include <stdio.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: Считать символ для типа фигуры ('c' для circle, 'r' для rectangle)
    // TODO: Если 'c', считать радиус, создать Circle и вызвать process_shape с его base
    // TODO: Если 'r', считать ширину и высоту, создать Rectangle и вызвать process_shape с его base
    return 0;
}

Все уроки раздела Object Oriented Programming