double arrow

Отношения между объектами

Естественно, программа, т. е. цельная система, реализуется только во взаимодействии всех ее объектов. Здесь можно выделить в основном два типа взаимодействий, или отношений: связь и агрегацию.

Связь является довольно очевидной разновидностью взаимодействий – один объект может воздействовать на другой, являющийся в известном смысле автономной сущностью. Существует отношение подчинения – "А использует В”. Один объект является активным, другой – пассивным. Понятно, что в системе один и тот же объект может выступать как в активной, так и в пассивной роли по отношению к различным объектам.

Другой тип отношений – агрегация, когда один объект является составной частью, т. е. элементом другого – "А содержит В”. Агрегация может означать физическое вхождение одного объекта в другой; в C++ это соответствует описанию первого объекта в качестве элемента данных другого объекта. Но это не обязательно. Например, в Windows есть понятие дочернего окна. Здесь имеет место отношение агрегации, хотя на физическом уровне родительское и дочернее окна автономны.

Класс

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

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

Наследование

Если существенными видами отношений между объектами являются связь и агрегация, то фундаментальное отношение между классами – это наследование. Один класс может наследовать другому. В C++ в таком случае говорят, что один класс является базовым, а другой (который наследует первому) – производным. Еще их называют соответственно классом-предком и классом-потомком. Наследование может быть прямым, когда один класс является непосредственным предком (потомком) другого, или косвенным, когда имеют место промежуточные наследования.

Производный класс наследует всю структуру характеристик и поведение базового, однако может дополнять или модифицировать их. Если класс В является производным по отношению к А, то с логической точки зрения "В есть А”. Например, понятие, или класс, "автомобиль” (В) является производным по отношению к понятию "средство передвижения” (А). Автомобиль есть средство передвижения? Конечно, да.

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

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

Полиморфизм

Полиморфизм, наряду с наследованием, является фундаментальной концепцией объектной модели программирования. Без него объектно-ориентированное программирование потеряло бы значительную долю своего смысла. Суть полиморфизма в том, что с объектами различных классов, имеющих один и тот же базовый класс, можно при определенных условиях обращаться, как с объектами базового класса; однако объект, являющийся, по видимости, объектом базового класса, будет вести себя по-разному в зависимости от того, что он такое на самом деле, т. е. представитель какого из производных классов.

В C++ полиморфное поведение объектов обеспечивается механизмом виртуальных функций-элементов. Рассмотрим пример "полиморфизма”, реализованного на языке С. Допустим, программа должна в числе всего прочего выводить на экран различные геометрические фигуры. Она определяет класс "фигура”, в котором предусмотрен виртуальный метод "нарисовать” (в C++ это был бы абстрактный класс). От данного класса "фигура” можно произвести несколько классов – "точка”, "линия”, "круг” и т. д., – каждый из которых будет по-своему определять метод "нарисовать”.

Указатель на класс "фигура” может ссылаться на объект любого из производных классов (поскольку все они являются фигурами), и для указываемого им объекта можно вызвать метод "нарисовать”, не имея представления о том, что это на самом деле за фигура.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: