Полиморфное использование
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 47 из 61.
Задание
ЛегкоДавайте докажем, что полиморфизм действительно работает, написав 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 должна вызвать функциюdrawshape, затем вызвать его функциюareaи вывести result с точностью до 2 десятичных знаков в форматеArea: X.XX.main.c: продемонстрируйте полиморфизм в действии. Считайте индикатор типа shape (cдля circle,rдля rectangle), за которым следуют необходимые размеры. Создайте соответствующий shape, затем передайте указатель на его встроенный memberShapeв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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C