
- •Тема 1.2. Об'єктна модель предметного середовища, принципи її побудови. Поняття об'єктів і класів та їх взаємовідносин
- •1. Поняття «Об'єктна модель предметного середовища». Порівнева конкретизація моделі. Конкретизація даних.
- •Что такое «Объектная модель» в ооп?
- •2. Взаємодія об’єктів. Конкретизація алгоритмів і міжоб’єктних зв’язків.
- •3. Поняття алгоритмів і даних в інтерпретації об’єктної моделі.
- •4. Принципи побудови об’єктної моделі.
- •5. Поняття класу. Типи даних і класи. Что такое «Класс» в ооп?
- •2. Відношення між класами, елементи (структура) класу, ієрархія класів.
- •3. Об’єкт, як представник класу.
- •4. Парадигми ооп: абстракція, інкапсуляція, спадкування, поліморфізм. Что является предметом абстрагирования в ооп?
- •Что понимается под наследованием в ооп?
- •В чем проявляется полиморфизм классов?
- •В чем особенности абстракции и инкапсуляции в ооп
Что понимается под наследованием в ооп?
Наследование — это механизм передачи свойств и методов родительского класса производным от него классам.
М
еханизм
наследования введен в ООП для того,
чтобы можно было описывать понятия
предметной области поуровнево, постепенно
уточняя свойства объектов. Небольшие
уточнения на каждом уровне «охватить
взглядом» и понять легче, чем полностью
сформированную структуру в модульном
программировании.
Другим полезным качеством наследования является то, что один родительский класс может порождать много наследников. Поэтому программисту не требуется каждый раз копировать текст программы из одного модуля в другой при построении нового модуля на основе более простого прототипа. И, соответственно, не нужно исправлять все копии такого текста при обнаружении ошибки в родительском классе, достаточно исправить родительский класс, чтобы остальные автоматически «унаследовали» эти изменения.
Один класс может наследовать другому. В C++ в таком случае говорят, что один класс является базовым, а другой (который наследует первому) — производным. Еще их называют соответственно классом-предком и классом-потомком. Наследование может быть прямым, когда один класс является непосредственным предком (потомком) другого, или косвенным, когда имеют место промежуточные наследования.
Производный класс наследует всю структуру характеристик и поведение базового, однако может дополнять или модифицировать их. Если класс В является производным по отношению к А, то с логической точки зрения “В есть А”. Например, понятие, или класс, “автомобиль” (В) является производным по отношению к понятию “средство передвижения” (А).
Как и в логике, здесь существует взаимосвязь между “содержанием” и “объемом” понятия. Производный класс имеет большее содержание, но меньший объем, чем базовый.
Наследование может быть простым, когда производный класс имеет всего одного непосредственного предка, и сложным, если в наследовании участвуют несколько базовых классов.
В чем проявляется полиморфизм классов?
Полиморфизм — это свойство объектов разных классов «выглядеть» одинаково, а вести себя, в соответствии со своими методами, по-разному.
Например, при вычислении расстояния между двумя точками нам все равно, это геометрические точки или материальные. Для программы расчета размеров изделия, и те и другие точки «выглядят» одинаково и, следовательно, могут передаваться в нее в качестве параметров.
Но, допустим, эта же программа рассчитывает и изменения размеров изделия при движении с ускорением. Для этого она просто попробует переместить все точки, послав им сообщения о размере, направлении и времени действия ускоряющей силы. Программа не знает, какие из полученных в качестве параметров точек являются материальными, а какие – геометрическими. Зато сами точки о себе это знают, и отреагируют на приложенную силу в соответствии со своей природой.
Кстати, полиморфизм может проявляться как для объекта в целом, так и для его отдельных функций. В классе для каждого вида перемещения может быть запрограммирован свой метод расчетов. Всем родственным методам можно дать одно имя, чтобы не пришлось запоминать много разных названий. Вызываемые функции будут различаться автоматически, в соответствии с параметрами переданного сообщения: если переданы смещения, то вызовется метод движения по прямой, а если центр и угол, то движение по дуге.
Полиморфизм, наряду с наследованием, является фундаментальной концепцией объектной модели программирования. Без него объектно-ориентированное программирование потеряло бы значительную долю своего смысла. Суть полиморфизма в том, что с объектами различных классов, имеющих один и тот же базовый класс, можно при определенных условиях обращаться, как с объектами базового класса; однако объект, являющийся, по видимости, объектом базового класса, будет вести себя по-разному в зависимости от того, что он такое на самом деле, т. е. представитель какого из производных классов.
В C++ полиморфное поведение объектов обеспечивается механизмом виртуальных функций-элементов. Допустим, программа должна в числе всего прочего выводить на экран различные геометрические фигуры. Она определяет класс “фигура”, в котором предусмотрен виртуальный метод “нарисовать” (в C++ это был бы абстрактный класс). От данного класса можно произвести несколько классов — “точка”, “линия”, “круг” и т. д., — каждый из которых будет по-своему определять этот метод.
Указатель на класс “фигура” может ссылаться на объект любого из производных классов (поскольку все они являются фигурами), и для указываемого им объекта можно вызвать метод “нарисовать”, не имея представления о том, что это за фигура на самом деле.