Повторение: Иерархия фигур
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 32 из 61.
Задание
ЛегкоДавайте построим полную иерархию фигур, демонстрирующую возможности наследования через композицию. Вы создадите базовый тип Shape, от которого сможет наследоваться любая конкретная фигура, а затем построите Rect, расширяющий его.
Вы организуете код в трёх файлах:
shape.h: Определите иерархию структур с защитой от повторного включения. Создайте структуруShapeс единственным полемcolor(целым числом). Затем определите структуруRect, которая встраиваетShapeв качестве своего первого члена и добавляет поляwidthиheight(оба целые числа). Объявите две функции:set_color, которая принимаетShape*и новое значение цвета, иprint_rect, которая принимаетRect*.shape.c: Реализуйте обе функции. Ваша функцияset_colorработает с базовым типом. Она изменяет цвет любой фигуры. Ваша функцияprint_rectотображает всю информацию о прямоугольнике, включая его унаследованный цвет.main.c: СоздайтеRectи initialize все его поля. Затем продемонстрируйте восходящее приведение, вызвавset_colorс вашим прямоугольником, приведённым к типуShape*. Наконец, выведите прямоугольник, чтобы убедиться, что цвет был изменён через указатель на базовый тип.
Вы получите четыре входных значения: width прямоугольника, его height, initial color и new color, который нужно установить с помощью универсальной функции.
В основном файле создайте прямоугольник с начальными значениями, затем используйте set_color, чтобы изменить его цвет на новое значение (не забудьте привести ваш Rect* к Shape*), и наконец вызовите print_rect, чтобы отобразить результат.
Ваш вывод должен выглядеть так:
Width: 10
Height: 5
Color: 7Здесь 10 — это width, 5 — height, а 7 — обновлённый цвет, а не начальный цвет. Главное, что нужно понять: set_color ничего не знает о прямоугольниках. Она работает только с Shape. Однако благодаря правилу первого члена и восходящему приведению цвет вашего прямоугольника изменяется с помощью этой универсальной функции.
Попробуйте сами
#include <stdio.h>
#include "shape.h"
int main() {
int width, height, initial_color, new_color;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &initial_color);
scanf("%d", &new_color);
// TODO: Создайте Rect и инициализируйте все его поля
// (width, height и цвет встроенного Shape значением initial_color)
// TODO: Вызовите set_color с прямоугольником, приведённым к Shape*
// чтобы изменить цвет на new_color
// TODO: Вызовите print_rect для отображения результата
return 0;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C