Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Особенностью ООП является то.doc
Скачиваний:
30
Добавлен:
09.02.2015
Размер:
467.97 Кб
Скачать

Композиция при разработке классов

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

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

В тех случаях, когда сходное поведения не просматривается или наследование по каким-либо причинам нецелесообразно, можно использовать композицию классов.

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

Пример

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

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

Класс «Сообщение» – родитель: класс «Окно_с_текстом:

поле Кнопка: Окно_с_текстом

метод Инициализировать

(аХ 1 ,aY 1 ,aX2, aY2, aColor, aXt, aYt, aText, ТХ1,

bY1, bX2, bY2, bColor, bXt, bYt, bText)

метод Изобразить

Конец описания.

Метод «Инициализировать» при этом должен получить двойной список параметров по сравнению с методом «Инициализировать» класса-родителя. Первым набором инициализируются родительские поля, а вторым - аналогичные поля включенного объекта (рис.).

Метод «Изобразить» должен выводить на экран оба окна: одно - используя родительский метод, второе - используя метод поля-объекта.

Доступ к компонентам объектного поля осуществляется с указанием имени объекта, имени поля, имени компонента:

<имя объекта>.<имя поля>.<имя компонента>

или

<имя объекта>.<имя поля>.<имя метод а>.

Возможно произвольное количество вложений объектных полей.

Наполнение при разработке классов

Включение объектов в некоторый класс можно реализовать и с использованием указателей на эти объекты. В отличие от объектного поля, которое включает в класс точно указанное количество объектов (1 или более - при использовании массива объектов) конкретного класса, использование указателей позволяет включить 0 или более объектов, если они собраны в массив или списковую (линейную или нелинейную) структуру.

Пример

Наполнение (класс «Функция»). В качестве примера рассмотрим класс, объекты которого должны осуществлять разбор заданного алгебраического выражения (выражение представляет собой запись функции от одной переменной - х). Данный объект должен обрабатывать сообщения:

«Конструировать» - в процессе конструирования должно строиться бинарное дерево вычисления выражения (рис.), переданного в списке параметров.

«Вычислить» - при обработке этого сообщения должно вычисляться значение функции по заданному значению аргумента.

В качестве элементов дерева будем использовать объекты класса «Триада». Объявление класса «Триада», реализующего элемент дерева вычислений, может выглядеть следующим образом:

Класс «Триада»:

поле-адрес Левое_поддерево: Триада

поле-адрес ПравоеПоддерево: Триада

поле Операция

поле Результат

метод Инициализировать (выражение)

Конец описания.

При описании класса Функция также используется поле-адрес:

Класс «Функция»:

поле-адрес Кореньдерева: ТРИАДА;

метод Конструировать (выражение);

метод Вычислить;

Конец описания.

Механизм наполнения в основном используется для подключения объекта или структуры объектов к некоторому классу, реализующему управление сразу всей структурой.