Полиморфизм поведенческих свойств объектов

Слово полиморфизм имеет греческое происхождение и переводится как "имеющий много форм".

Полиморфизм - это свойство, которое позволяет одно и тоже имя использовать для решения нескольких технически разных задач.

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

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

Представьте, что нужно открыть замок и есть связка ключей. И вот мы пытаемся его открыть. Мы имеем связку ключей, у каждого из которых есть какие-то параметры (форма, размер). Для того, чтобы открыть дверь мы перебираем один ключ за другим пока не найдем подходящий. Т.е. когда шаблон замка совпадает с шаблоном параметров ключа, замок открывается. Аналогично работает компилятор при наличии нескольких функций. Он последовательно проверяет шаблоны функций с одним и тем же именем пока не найдет подходящий.

Полиморфизм определяют как свойство объектов-родственников по-разно­му осуществлять однотипные (и даже одинаково поименованные) действия, т. е. од­нотипные действия у множества родственных классов имеют множество различных форм. Например, метод «нарисовать на экране» должен по-разному реализовываться для родственных классов «точка», «прямая», «ломанная», «прямоугольник». В ООП действия или поведение объекта определяется набором методов. Изменяя алгоритм метода в потомках класса, программист придает наследникам специфические пове­денческие свойства. Для изменения метода необходимо перекрыть его в потомке, т. е. объявить в потомке одноименный метод и реализовать в нем нужные действия, отра­жающие специфику потомка.

Свойство полиморфизма реализуется не только в механизме замещения (перекры­тия) одноименных методов при наследовании свойств, но и в механизме виртуализа­ции методов или позднем связывании методов. Если замещение метода реализуется на этапе компиляции (раннее связывание объекта с методом), то замещение объявленного в описании класса виртуальным (virtual) происходит на этапе выполнения (позднее связывание).

Сравним два подхода к покупке, к примеру, килограмма апельсинов. В первом случае мы заранее знаем, что нам надо купить 1 кг апельсинов. Поэтому мы берем небольшой пакет, не много, но достаточно денег, чтобы хватило на этот килограмм. Во втором случае, мы, выходя из дома, не знаем что и как много нам надо купить. Поэтому мы берем машину (а вдруг будет много всего и тяжелое), запасаемся пакетами больших и малых размеров и берем как можно больше денег. Едем на рынок и выясняется, что надо купить только 1 кг апельсинов.

Приведенный пример в определенной мере отражает смысл применения раннего и позднего связывания, соответственно. Очевидно, что для данного примера первый вариант оптимален. Во втором случае мы слишком много всего предусмотрели, но нам это не понадобилось. С другой стороны, если по дороге на рынок мы решим, что апельсины нам не нужны и решим купить 10 кг яблок, то в первом случае мы уже не сможем этого сделать. Во втором же случае - легко.

А теперь рассмотрим этот пример с точки зрения программирования. При применении раннего связывания, мы как бы говорим компилятору: "Я точно знаю, чего я хочу. Поэтому жестко(статически) связывай все вызовы функций". При применении механизма позднего связывания мы как бы говорим компилятору: "Я пока не знаю чего я хочу. Когда придет время, я сообщу что и как я хочу". Таким образом, во время раннего связывания вызывающий и вызываемый методы связываются при первом удобном случае, обычно при компиляции. При позднем связывании вызываемого метода и вызывающего метода они не могут быть связаны во время компиляции. Поэтому реализован специальный механизм, который определяет как будет происходить связывание вызываемого и вызывающего методов, когда вызов будет сделан фактически.

Очевидно, что скорость и эффективность при раннем связывании выше, чем при использовании позднего связывания. В то же время, позднее связывание обеспечивает некоторую универсальность связывания.

Виртуальные методы выполняются мед­леннее, из-за необходимости дополнительных действий по связыванию.

Создание и уничтожение объектов.

Описание класса в ООП есть некоторая программная структура, которую ис­пользуют при создании объектов, отличающихся именами и отдельными свойства­ми. Создание и удаление объектов осуществляется с помощью специальных мето­дов, которые называются конструкторами (constructor) и деструкторами (destructor) соответственно.

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

Взаимодействие объектов и сообщения.

Отношение родства или включения свойств - это только один из многих типов отношений между классами. Еще одним важнейшим типом отношений между клас­сами и между объектами являются отношения взаимодействия или отношения «кли­ент-сервер». Отношения родства также подразумевают определенное отношение вза­имодействия, ограниченное свойством инкапсуляции.

Благодаря инкапсуляции объекты так хорошо изолируются друг от друга, что необходимо специально заботится о механизме их взаимодействия в программе. Это касается независимых объектов, а не тех, которые погруже­ны в другие объекты в виде элементов данных этих объектов. Но и в последнем случае взаимодействие может быть ограниченно соглашения­ми о видимости (доступности) элементов данных и методов родственных объектов и инкапсулированных объектов. Поэтому для его расширения требуется специаль­но заботиться об этом.

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

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

8.3. Этапы объектно-ориентированного программирования.

Программа, решающая некоторую задачу, заключает в себе описание части мира, относящегося к этой задаче или определенной предметной области. Описание дей­ствительности в форме взаимодействующих объектов, по-видимому, естественнее, чем в форме иерархии подпрограмм, и поэтому облегчает программное моделирование в некоторой предметной области.

В процессе программирования в объектно-ориентированном стиле можно выде­лить следующие этапы:

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

2. Определение или формулирование принципов взаимодействия классов и взаи­модействия объектов в рамках программной системы.

3. Установление иерархии взаимосвязи свойств родственных классов.

4. Реализация иерархии классов с помощью механизмов инкапсуляции, наследо­вания и полиморфизма.

5. Для каждого класса реализация полного набора методов для управления свой­ствами объектов.

В результате будет создана объектно-ориентированная среда или библиоте­ка классов, позволяющая решать задачи моделирования в определенной пред­метной области.

Первые три этапа и являются объектно-ориентированным анализом предмет­ной области.

ООП обладает следующими достоинствами:

- использование более естественных понятий и имен из повседневной жизни или предметной области;

- простота введения новых понятий на основе старых;

- отображение в библиотеке классов наиболее общих свойств и отношений между объектами моделируемой предметной области;

- естественность отображения пространства решаемой задачи в пространство объектов программы;

- простота внесения изменений в классы, объекты и программу в целом;

- полиморфизм классов упрощает составление и понимание программ;

- локализация свойств и поведения на основе инкапсуляции и разграничения дос­тупа упрощают понимание структуры программы и ее отладку;

- передача параметров в конструкторах объектов повышает гибкость создаваемых программных систем.


В качестве недостатков ООП можно отметить следующие:

- снижение быстродействия программ, особенно при использовании виртуальных методов;

- большие затраты времени на разработку библиотеки классов, поэтому ООП це-лесообразно при создании больших программ, а не при написании маленьких единичных программ;

- необходимость анализа полной иерархии классов для правильного использова­ния свойств базовых классов.

Целесообразность применения технологии ООП для создания конкретной про­граммной системы определяется двумя главными факторами:

- спецификой предметной области и решаемой прикладной задачи;

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

Предметная область может быть в большей или меньшей степени разработан­ной для использования технологии ООП. В разработанных областях ясны клас­сы, их иерархия и отношения взаимодействия. В неразработанных областях ис­пользование ООП предусматривает гораздо большие затраты на первоначальных этапах разработки (объектно-ориентированный анализ, проектирование и созда­ние библиотеки классов).

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


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



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