Ранее было указано, что в результате объектной декомпозиции второго и более уровней могут быть получены объекты, находящиеся между собой в отношении включения (см. рис. 12). Классы для реализации таких объектов могут строиться двумя способами: 1) с использованием наследования или 2) композиции.
Применение наследования эффективно в том случае, если разрабатываемый класс имеет с исходным сходную структуру и элементы поведения, например Окно и Окно_меняющее_цвет.
В тех случаях, когда сходное поведение не просматривается или наследование по каким-либо причинам нецелесообразно, можно использовать композицию классов.
Композицией называется такое отношение между классами, когда один является частью второго. Конкретно, композиция реализуется включением в класс поля, являющегося объектом другого класса. Такие поля обычно называют объектными полями.
Рассмотрим применение композиции на примере класса Сообщение (пример Окно_с_текстом). Визуально сообщение обычно выглядит как окно с текстом и кнопкой подтверждения (см. рис. 22).
Рис. 22 − Вид окна сообщения
При разработке класса Сообщение попытаемся использовать уже написанный ранее класс Окно_с_текстом. Окно Сообщение без кнопки представляет собой объект класса Окно_с_текстом. Кнопка также представляет собой Окно_с_текстом. Попытка использования при разработке множественного наследования приведет к дублированию полей данных. Чтобы этого избежать, используем для хранения параметров изображения кнопки поле типа Окно_с_текстом.
Класс Сообщение может быть записан так:
Класс Сообщение – родитель: класс Окно_с_текстом:
Поле Кнопка: Окно_с_текстом
Метод Инициализировать (aXl,aYl,aX2,aY2,aColor,
aXt, aYt, aText,
bXl,bYl,bX2,bY2,bColor,
bXt, bYt, bText)
метод Изобразить