- •Типы отношений между объектами. Интерфейс и реализация класса. Наследование. Простой полиморфизм. Сложный полиморфизм. Композиция. Наполнение.
- •2. Если объект является результатом декомпозиции более сложного объекта, то говорят, что между этими объектами существует отношение включения - первый объект включает второй (иерархия целое/часть).
- •Простой полиморфизм.
- •2) При работе с указателями, когда указателю на объект класса-родителя присваивается адрес объекта класса-потомка.
- •Композиция.
- •Пример Композиции (класс Сообщение )
- •Конец описания.
- •Наполнение
- •Делегирование методов.
Простой полиморфизм.
При создании иерархии классов может обнаружиться, что некоторые свойства объектов, сохраняя название, изменяются по сути. Для реализации таких иерархий в языке программирования должен быть предусмотрен механизм полиморфизма, обеспечивающий возможность задания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии. В ООП такой полиморфизм называется простым, а методы, имеющие одинаковое название - статическими полиморфными. Совокупность полиморфных методов с одним именем для иерархии классов образует единый полиморфный метод иерархии, в котором реализация полиморфного метода для конкретного класса представляет отдельный аспект.
Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев:
1) чистый полиморфизм - используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, в языке Lisp или Smalltalk;
2) перегрузка (полиморфные имена функций) - используется, когда определяется несколько функций с одним именем - одно и то же имя функции может много кратно использоваться в разных местах программы; выбор нужной функции может определяется типами аргументов, областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перегрузка называется параметрической; например, язык С++ позволяет разработчику выполнять параметрическую перегрузку функций вне классов;
переопределение - используется в ООП при необходимости задания различных реализаций одноименных методов в иерархии классов; различают:
а) простой полиморфизм – конкретный метод определяется типом объекта при компиляции программы (раннее связывание); одноименные методы при использовании простого полиморфизма называются статическими полиморфными;
б) сложный полиморфизм (полиморфные объекты) – конкретный метод определяется типом объекта при выполнении программы (позднее связывание); одноименные методы при использовании сложного полиморфизма называются виртуальными полиморфными ;
обобщенные функции или шаблоны - используется в ООП при реализации в языке параметризованных классов (например, в С++), параметрами такого класса являются типы аргументов методов класса .
Приведем пример простого полиморфизма (класс Окно_с_текстом)
Пусть необходимо разработать на базе класса Окно класс Окно_с_текстом. Для этого к полям класса Окно необходимо добавить специальные поля для определения координат первой буквы текста - Xt, Yt и поле, содержащее сам текст - Text. Кроме этого, понадобится специальный метод, который будет обрабатывать сообщение «Нарисовать». Однако у нас уже существует родительский метод Изобразить (!), который обрабатывает это сообщение. Следовательно, необходимо заменить родительский метод методом потомка. Механизм полиморфизма позволяет для класса-потомка Окно_с_текстом предусмотреть собственный метод Изобразить (рис. 10).
Рис. 10. Иерархия классов Окно и Окно_с_текстом
Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные поля класса.
Класс Окно_с_текстом – родитель: класс Окно:
поля Xt, Yt, Text
метод Инициировать(aX1,aY1,aX2,aY2,aColor,aXt, aYt, aText)
метод Изобразить
Конец описания.
Сложный полиморфизм или создание полиморфных объектов.
Полиморфными объектами или полиморфными переменными называются переменные, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной. В языках с жесткой типизацией такая ситуация может возникнуть:
при передаче объекта типа класса-потомка в качестве фактического параметра подпрограмме, в которой этот параметр описан, как параметр типа класса-родителя (явно - в списке параметров или неявно – в качестве внутреннего параметра, используемого при вызове методов - self или this);
