Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 47 из 61.

challenge icon

Задание

Легко

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

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

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

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

Ваша программа получит один из следующих вариантов:

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

Пример вывода, когда входными данными являются 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. Преобразовав встроенный member Shape вашего конкретного shape в Shape*, вы можете передать любой тип shape в эту единственную function. Это и есть полиморфизм: одна function, несколько вариантов поведения в зависимости от фактического типа объекта.

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

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

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

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C