- •Теоретические основы объектно-ориентированного программирования
- •Объектная декомпозиция
- •Диаграмма обслуживания автомашин на бензоколонке
- •Диаграмма объектов имитационной модели бензоколонки
- •Объектная декомпозиция Блока колонок: 1 - когда освободится колонка? 3 - колонка свободна? 2 - освободить колонку 4 - занять колонку
- •Диаграмма объектов графического редактора
- •Диаграмма состояний интерфейса пользователя программы «Записная книжка»
- •Диаграмма объектов предметной области программы «Записная книжка»
- •Обозначение ассоциации: а - с указанием имени ассоциации и ее направления; б - с указанием имен ролей; в - с указанием множественности
- •Контекстная диаграмма классов программы «Записная книжка»
- •Объекты и сообщения
- •Типы отношений между объектами
- •Соответствие объекта-абстракции классу и объектам-переменным
- •Основные средства разработки классов
- •Иерархии классов при различных видах наследования
- •Иерархия классов Окно и Окно_меняющее_цвет
- •Иерархия классов Окно и Окно_с_текстом
- •Иерархия классов при сложном полиморфизме
- •Необходимость позднего связывания
- •Реализация механизма позднего связывания
- •Необходимость явного указания типа объекта, адресуемого указателем родительского класса
- •Вид окна сообщения
- •Структура полей класса Сообщение
- •Дополнительные средства и приемы разработки классов
- •Организация стека вызовов
- •Определение класса
- •Организация списка объектов с использованием статических компонентов класса
- •Конструкторы и деструкторы
- •Наследование
- •Иерархия классов Целое число - Вещественное число
- •Диаграмма классов с наследованием от двух классов и объектным полем
- •Иерархия с многократным наследованием
- •Исключения
- •1. Динамическая проверка типа объекта:
- •2. Динамическое переопределение типа объекта:
- •3. Динамическое определение типа объекта:
-
Необходимость позднего связывания
-
Реализация механизма позднего связывания
Реализация механизма позднего связывания осуществляется с использованием специальной таблицы, получившей название таблицы виртуальных методов (ТВМ). ТВМ создается для каждого класса, имеющего собственные или наследующего виртуальные методы, и содержит адреса аспектов виртуальных методов класса. Объекты же классов с виртуальными методами включают невидимое поле, содержащее адрес ТВМ своего класса (Рис. 2.6.). При вызове виртуального метода для объекта по этому адресу происходит обращение к ТВМ класса, по которой и определяется требуемый метод.
При использовании полиморфных объектов возникают проблемы с доступом к полям объекта, описанным в классе-потомке: указатель на объект класса-родителя связан с описанием полей класса-родителя, и поля, описанные в классе-потомке, для него «невидимы» (Рис. 2.7.).
В таких случаях приходится средствами используемого языка явно переопределять тип объекта.
Композиция. В результате объектной декомпозиции второго и более уровней могут быть получены объекты, находящиеся между собой в отношении включения (см. 5Рис. 1.1.). Это отношение можно реализовать, используя наследование, композицию или наполнение.
-
Необходимость явного указания типа объекта, адресуемого указателем родительского класса
Композицией называется такое отношение между классами, когда один является частью второго. Конкретно, обычно композиция реализуется включением в класс поля, являющегося объектом другого класса. Такие поля называют объектными. Для реализации включения нескольких однотипных объектов используют массивы и другие структуры, элементами которых являются объекты.
Если включаемый объект единственный, то классы для реализации таких объектов могут строиться как с использованием наследования, так и с использованием композиции. Применение наследования эффективно в том случае, если разрабатываемый класс имеет с имеющимся сходную структуру и элементы поведения, например, Окно и Окно_меняющее_цвет. Если похожее поведение не просматривается или наследование по каким-либо другим причинам нецелесообразно, то для реализации включения объекта можно использовать композицию классов.
Если включаемых элементов много, то при построении классов используют композицию или наполнение. Поскольку композиция предполагает реализацию объектными полями, то ее используют, если количество включаемых элементов существенно не меняется, а типы объектов известны заранее. При нарушении этих условий для включения объектов применяют наполнение, при котором класс содержит не объектное поле, а указатель на него.
-
Композиция (класс Сообщение - продолжение примера 1.5).
Визуально сообщение обычно выглядит, как окно с текстом и кнопкой подтверждения (Рис. 2.8.).
При разработке класса Сообщение попытаемся использовать уже описанный класс Окно_с_текстом. Окно сообщения без кнопки представляет собой объект класса Окно_с_текстом. Кнопка также представляет собой Окно_с_текстом. Попытка применения при разработке множественного наследования приведет к дублированию имен полей. Чтобы этого избежать, используем комбинацию наследования и композиции: родительское Окно_с_текстом, включенное в проектируемый класс, будем использовать как окно с текстом сообщения, а для хранения параметров изображения кнопки добавим объектное поле Кнопка также типа Окно с текстом.