- •Объектная декомпозиция
- •Объекты и сообщения
- •Т: Классы
- •Ограничение доступа классов
- •Наследование при разработке классов
- •Полиморфизм при разработке классов
- •Композиция при разработке классов
- •Наполнение при разработке классов
- •Дополнительные средства и приемы разработки классов
- •Исключения при разработке классов
Композиция при разработке классов
В результате объектной декомпозиции второго и более уровней могут быть получены объекты, находящиеся между собой в отношении включения (лекция № 2). Классы для реализации таких объектов могут строиться двумя способами: с использованием наследования или композиции.
Применение наследования эффективно в том случае, если разрабатываемый класс имеет с исходным сходную структуру и элементы поведения, например, «Окно» и «Окно_меняющее_цвет».
В тех случаях, когда сходное поведения не просматривается или наследование по каким-либо причинам нецелесообразно, можно использовать композицию классов.
Композицией называетсятакое отношение между классами, когда один является частью второго. Конкретно, композиция реализуется включением в класс поля, являющегося объектом другого класса. Такие поля обычноназывают объектными полями.
Пример
Композиция (класс «Сообщение»). Визуально сообщение обычно выглядит, как окно с текстом и кнопкой подтверждения (рис.).
При разработке класса «Сообщение» попытаемся использовать уже описанный класс «Окно_с_текстом». Окно сообщения без кнопки представляет собой объект класса «Окно_с_текстом». Кнопка также представляет собой «Окно_с_текстом». Попытка использования при разработке множественного наследования приведет к дублированию полей. Чтобы этого избежать, используем для хранения параметров изображения кнопки поле типа «Окно_с_текстом».
Класс «Сообщение» – родитель: класс «Окно_с_текстом:
поле Кнопка: Окно_с_текстом
метод Инициализировать
(аХ 1 ,aY 1 ,aX2, aY2, aColor, aXt, aYt, aText, ТХ1,
bY1, bX2, bY2, bColor, bXt, bYt, bText)
метод Изобразить
Конец описания.
Метод «Инициализировать» при этом должен получить двойной список параметров по сравнению с методом «Инициализировать» класса-родителя. Первым набором инициализируются родительские поля, а вторым - аналогичные поля включенного объекта (рис.).
Метод «Изобразить» должен выводить на экран оба окна: одно - используя родительский метод, второе - используя метод поля-объекта.
Доступ к компонентам объектного поля осуществляется с указанием имени объекта, имени поля, имени компонента:
<имя объекта>.<имя поля>.<имя компонента>
или
<имя объекта>.<имя поля>.<имя метод а>.
Возможно произвольное количество вложений объектных полей.
Наполнение при разработке классов
Включение объектов в некоторый класс можно реализовать и с использованием указателей на эти объекты. В отличие от объектного поля, которое включает в класс точно указанное количество объектов (1 или более - при использовании массива объектов) конкретного класса, использование указателей позволяет включить 0 или более объектов, если они собраны в массив или списковую (линейную или нелинейную) структуру.
Пример
Наполнение (класс «Функция»). В качестве примера рассмотрим класс, объекты которого должны осуществлять разбор заданного алгебраического выражения (выражение представляет собой запись функции от одной переменной - х). Данный объект должен обрабатывать сообщения:
«Конструировать» - в процессе конструирования должно строиться бинарное дерево вычисления выражения (рис.), переданного в списке параметров.
«Вычислить» - при обработке этого сообщения должно вычисляться значение функции по заданному значению аргумента.
В качестве элементов дерева будем использовать объекты класса «Триада». Объявление класса «Триада», реализующего элемент дерева вычислений, может выглядеть следующим образом:
Класс «Триада»:
поле-адрес Левое_поддерево: Триада
поле-адрес ПравоеПоддерево: Триада
поле Операция
поле Результат
метод Инициализировать (выражение)
Конец описания.
При описании класса Функция также используется поле-адрес:
Класс «Функция»:
поле-адрес Кореньдерева: ТРИАДА;
метод Конструировать (выражение);
метод Вычислить;
Конец описания.
Механизм наполнения в основном используется для подключения объекта или структуры объектов к некоторому классу, реализующему управление сразу всей структурой.