Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лекции 2010.doc
Скачиваний:
69
Добавлен:
17.03.2015
Размер:
954.37 Кб
Скачать
      1. Необходимость позднего связывания

      1. Реализация механизма позднего связывания

Реализация механизма позднего связывания осуществляется с использованием специальной таблицы, получившей название таблицы виртуальных методов (ТВМ). ТВМ создается для каждого класса, имеющего собственные или наследующего виртуальные методы, и содержит адреса аспектов виртуальных методов класса. Объекты же классов с виртуальными методами включают невидимое поле, содержащее адрес ТВМ своего класса (Рис. 2.6.). При вызове виртуального метода для объекта по этому адресу происходит обращение к ТВМ класса, по которой и определяется требуемый метод.

При использовании полиморфных объектов возникают проблемы с доступом к полям объекта, описанным в классе-потомке: указатель на объект класса-родителя связан с описанием полей класса-родителя, и поля, описанные в классе-потомке, для него «невидимы» (Рис. 2.7.).

В таких случаях приходится средствами используемого языка явно переопределять тип объекта.

Композиция. В результате объектной декомпозиции второго и более уровней могут быть получены объекты, находящиеся между собой в отношении включения (см. 5Рис. 1.1.). Это отношение можно реализовать, используя наследование, композицию или наполнение.

      1. Необходимость явного указания типа объекта, адресуемого указателем родительского класса

Композицией называется такое отношение между классами, когда один является частью второго. Конкретно, обычно композиция реализуется включением в класс поля, являющегося объектом другого класса. Такие поля называют объектными. Для реализации включения нескольких однотипных объектов используют массивы и другие структуры, элементами которых являются объекты.

Если включаемый объект единственный, то классы для реализации таких объектов могут строиться как с использованием наследования, так и с использованием композиции. Применение наследования эффективно в том случае, если разрабатываемый класс имеет с имеющимся сходную структуру и элементы поведения, например, Окно и Окно_меняющее_цвет. Если похожее поведение не просматривается или наследование по каким-либо другим причинам нецелесообразно, то для реализации включения объекта можно использовать композицию классов.

Если включаемых элементов много, то при построении классов используют композицию или наполнение. Поскольку композиция предполагает реализацию объектными полями, то ее используют, если количество включаемых элементов существенно не меняется, а типы объектов известны заранее. При нарушении этих условий для включения объектов применяют наполнение, при котором класс содержит не объектное поле, а указатель на него.

        1. Композиция (класс Сообщение - продолжение примера 1.5).

Визуально сообщение обычно выглядит, как окно с текстом и кнопкой подтверждения (Рис. 2.8.).

При разработке класса Сообщение попытаемся использовать уже описанный класс Окно_с_текстом. Окно сообщения без кнопки представляет собой объект класса Окно_с_текстом. Кнопка также представляет собой Окно_с_текстом. Попытка применения при разработке множественного наследования приведет к дублированию имен полей. Чтобы этого избежать, используем комбинацию наследования и композиции: родительское Окно_с_текстом, включенное в проектируемый класс, будем использовать как окно с текстом сообщения, а для хранения параметров изображения кнопки добавим объектное поле Кнопка также типа Окно с текстом.