Добавление, замещение и уточнение методов класса при наследовании.



Класс - это некое множество объектов, имеющих общую структуру и общее поведение.

Класс- опи­сание структуры и поведения объектов, связанных отношением общности.

Наследование - это такое отношение между классами, когда один класс повторяет структуру и поведение другого класса (одиночное наследование) или других (множественное наследование) классов.

Классы, экземпляры которых не создаются, называются абстрактными. Ожидается, что подклассы абстрактных классов доопределят их до жизнеспособной абстракции, наполняя класс содержанием.

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

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

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

- В производном классе можно добавлять свои методы – члены класса.Необходимо использовать имена, отличные от имен методов суперкласса, или использовать другой набор входных/выходных параметров.

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

- Если в классе-наследнике имя метода и его прототип совпадают с именем метода базового класса, то метод производного класса скрывает (замещает)метод базового класса. Чтобы получить из подкласса доступк методу суперкласса, используется оператор :: (разыменования).

- Уточнение – уточняющий метод выполняет метод суперкласса и добавляет некоторые действия.

 

Когда в суперклассе определен виртуальный метод, который затем переопределяется в классах-потоках, возникает неоднозначность вызова метода.

Существует два способа связывания (замещения) вызывающего и вызываемого методов:

- Невиртуальное замещение – адрес методов определяется на момент трансляции кода.

Вызов методов объекта происходит в соответствии с типом указателя, а не фактическим типом объекта, на который он ссылается (раннее связывание).

Достоинства: скорость и эффективность.

- Виртуальное замещение - адрес методов определяется на момент выполнения кода (позднее связывание).

Достоинство: универсальность.

Для определения типа объекта по указателю или ссылке во время выполнения программы в С++ используется динамическая идентификация типа данных (RTTI) (операторы dynamic_cast и typeid).

Механизм позднего связывания: когда разрешение ссылок на метод происходит на этапе выполнения программы в зависимости от конкретного типа объекта, вызвавшего метод. Адрес метода для определенного типа объекта выбирается из таблицы виртуальных методов (координирующей таблицы) - механизм динамического соответствия, используемый во многих языках программирования.

Обычно компилятор создает отдельную vtable для каждого класса. После создания объекта указатель на эту vtable, называемый виртуальный табличный указатель или vpointer, добавляется как скрытый член данного объекта. Компилятор также генерирует «скрытый» код в конструкторе каждого класса для инициализации vpointer'ов его объектов адресами соответствующей vtable.

 

Отношение ассоциации между классами, включая агрегацию.

Ассоциация (association)– описание связей между экземплярами классов.

Ассоциация — двусторонняя ссылка, при каждом изменении ассоциации изменяются атрибуты обоих объектов. Говорят о множественности ассоциации, т.е. о количестве объектов, участвующих в ней.

Обозначается сплошной линией со стрелкой или без нее и с дополнительными символами, которые характеризуют специальные свойства ассоциации:

- Имя ассоциации - необязательный элемент ее обозначения. Однако если оно задано, то записывается с заглавной буквы.

- Множественность или кратность ассоциации – отношение 1-1, 1-n, n-m.

Ассоциация может быть бинарной – связывает в точности два различных класса и может быть ненаправленным (симметричным) или направленным отношением. Частный случай бинарной ассоциации - рефлексивная ассоциация, которая связывает класс с самим собой. Ненаправленная бинарная ассоциация изображается линией без стрелки. Для нее на диаграмме может быть указан порядок чтения классов с использованием значка в форме треугольника рядом с именем данной ассоциации.

Направленная бинарная ассоциация изображается сплошной линией с простой стрелкой на одной из ее концевых точек. Направление этой стрелки указывает на то, какой класс является первым, а какой - вторым.

Пример бинарной направленной ассоциации

Помимо бинарной ассоции также существуют n-арные, где n – количество классов.

Агрегация (aggregation) - специальная форма ассоциации, которая служит для представления отношения типа "часть-целое" между агрегатом (целое) и его составной частью. Идя от целого (агрегата), можно прийти к его частям (атрибутам), но не наоборот (нельзя найти агрегирующий объект (контейнер), если только сведения о нем не являются случайно частью состояния агрегируемого объекта.).

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

Объект, являющийся атрибутом другого объекта (агрегата), имеет связь со своим агрегатом. Через эту связь агрегат может посылать ему сообщения. 

Агрегация может означать физическое вхождение одного объекта в другой, но не обязательно.

 

 


Дата добавления: 2018-06-01; просмотров: 400; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!