Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Полиморфизм



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

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

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

Например, метод «отобразить геометрическую фигуру на экране» - на самом деле не метод, а класс, так как характер фигуры определяет конкретный способ отображения (конкретный метод).

Методы одного класса обычно наделяются общим именем, например, Show, Init.

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

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

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

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

В Паскале полиморфизм достигается также виртуализацией методов, позволяющей родительским методам обращаться к методам потомков.

Позднее связывание. Несмотря на то что три перечисленных принципа называют «тремя китами ООП», сами по себе они не имеют смысла без наличия особого механизма, названного поздним (динамическим) связыванием. Приведем пример.

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

Действительно, в момент компиляции нашей программы мы жестко определяем, что при вызове метода доступа к элементу объекта класса «матрица» вызывается метод объекта класса-наследника «двумерный массив». Даже если мы разместим по тем же адресам (или передадим в качестве параметров) объекты других классов-наследников («блочная матрица», например), все равно будет вызываться метод класса «двумерный массив». Это и приведет к блокировке программы.

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

Однако позднее связывание должно быть применено не ко всем методам, а только к специфическим для каждого класса-наследника. К примеру, вызов метода обращения должен быть одинаков для всех объектов класса «матрица» - алгоритм одинаков для всех матриц. То есть все методы класса по способу вызова делятся на две группы:

1) методы, для которых механизм позднего связывания не применяется; они, насколько нам известно, не получили названия (за исключением «обычные»);

2) методы, для которых этот механизм применяется; они получили название «виртуальные методы» (среди них еще выделяют «динамические виртуальные методы», но они по принципам вызова не отличаются).

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

Объектно-ориентированное программирование базируется на трех принципах и одном механизме: инкапсуляция, наследование, полиморфизм и позднее связывание (иногда к ним приписывают программирование, управляемое сообщениями).





Дата публикования: 2014-10-25; Прочитано: 366 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...