- •Типы отношений между объектами. Интерфейс и реализация класса. Наследование. Простой полиморфизм. Сложный полиморфизм. Композиция. Наполнение.
- •2. Если объект является результатом декомпозиции более сложного объекта, то говорят, что между этими объектами существует отношение включения - первый объект включает второй (иерархия целое/часть).
- •Простой полиморфизм.
- •2) При работе с указателями, когда указателю на объект класса-родителя присваивается адрес объекта класса-потомка.
- •Композиция.
- •Пример Композиции (класс Сообщение )
- •Конец описания.
- •Наполнение
- •Делегирование методов.
Пример Композиции (класс Сообщение )
Визуально сообщение обычно выглядит, как окно с текстом и кнопкой подтверждения (рис. 15).
Рис. 15. Вид окна сообщения
При разработке класса Сообщения попытаемся использовать уже описанный класс Окно_с_текстом. Окно сообщения без кнопки представляет собой объект класса Окно_с_текстом. Кнопка также представляет собой Окно_с_текстом. Попытка использования при разработке множественного наследования приведет к дублированию полей. Чтобы этого избежать, используем для хранения параметров изображения кнопки поле типа Окно_с_текстом.
Класс Сообщение – родитель: класс Окно_с_текстом:
поле Кнопка: Окно_с_текстом
метод Инициализировать (
aX1,aY1,aX2,aY2,aColor,aXt,aYt,aText,
bX1,bY1,bX2,bY2,bColor,bXt,bYt,bText)
метод Изобразить
Конец описания.
Метод Инициализировать при этом должен получить двойной список параметров по сравнению с методом Инициализировать класса родителя. Первым набором инициализируются родительские поля, а вторым - аналогичные поля включенного объекта (рис. 16).
Рис. 16. Структура полей класса Сообщение
Метод Изобразить должен выводить на экран оба окна: одно - используя родительский метод, второе - используя метод поля-объекта.
Доступ к компонентам объектного поля осуществляется с указанием имени объекта, имени поля, имени компонента:
<имя объекта>.<имя поля>.<имя компонента> или
<имя объекта>.<имя поля>.<имя метода>.
Возможно, произвольное количество вложений объектных полей.
Наполнение
Включение объектов в некоторый класс можно реализовать и с использованием указателей на эти объекты. В отличие от объектного поля, которое включает в класс точно указанное количество объектов (1 или более – при использовании массива объектов) конкретного класса, использование указателей позволяет включить 0 или более объектов, если они собраны в массив или списковую (линейную или нелинейную) структуру.
Пример Наполнения(класс Функция)
В качестве примера рассмотрим класс, объекты которого должны осуществлять разбор заданного алгебраического выражения (выражение представляет собой запись функции от одной переменной - x). Данный объект должен обрабатывать сообщения:
1. «Конструировать» - в процессе конструирования должно строиться бинарное дерево вычисления выражения (рис. 17), переданного в списке параметров.
Рис. 17. Дерево вычисления выражения
2. «Вычислить» - при обработке этого сообщения должно вычисляться значение функции по заданному значению аргумента.
В качестве элементов дерева будем использовать объекты класса Триада. Объявление класса Триада, реализующего элемент дерева вычислений может выглядеть следующим образом:
Класс Триада:
поле-адрес Левое_поддерево: Триада
поле-адрес Правое_Поддерево :Триада
поле Операция
поле Результат
метод Инициализировать (выражение)
Конец описания.
При описании класса Функция мы также используем поле-адрес:
Класс Функция:
полe-адрес Корень_дерева: ТРИАДА;
метод Конструировать (выражение) ;
метод Вычислить;
Конец описания.
Механизм наполнения в основном используется для подключения объекта или структуры объектов к некоторому классу, реализующему управление сразу всей структурой.
Дополнительные средства и приемы разработки классов
Рассмотренные ранеесредства разработки классов являются основными. Они предусматриваются принципами ООП. Однако к настоящему моменту постепенно складывается более сложная модель ООП, включающая такие понятия как метаклассы, контейнерные классы, делегирование методов, параметризованные классы. Появление в языках программирования соответствующих средств позволяет создавать более эффективные программы.
Метаклассы. Дальнейшее развитие идеи реализации полиморфных объектов привело к появлению более высокого уровня абстракции - метаклассов. Метакласс - тип, значениями которого являются классы, как ссылки на типы. Переменные типа метакласса можно использовать вместо явного указания класса в соответствии с традиционными правилами косвенного доступа (рис. 18).
Рис. 18. Организация прямого и косвенного доступа к классу
Реализация метаклассов базируется на использовании специальных таблиц, в которых хранится информация о классе: имя класса, имя класса-родителя, адреса методов и т.д. Поскольку эти таблицы используются во время выполнения программы, то они получили название RTTI (Run Time Type Information – «информация о типе времени выполнения»).
Эти же таблицы используются для реализации следующих операций:
