Полиморфизм виды полиморфизма примеры реферат

Обновлено: 17.05.2024

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

Постановка задачи

Самые простые варианты, которые приходят в голову — написать три отдельных класса и работать с ними. Или написать один класс, в которым будут все свойства, присущие всем трем типам публикаций, а задействоваться будут только нужные. Но ведь для разных типов аналогичные по логике методы должны работать по-разному. Делать несколько однотипных методов для разных типов (get_news, get_announcements, get_articles) — это уже совсем неграмотно. Тут нам и поможет полиморфизм.

Абстрактный класс

Грубо говоря, это класс-шаблон. Он реализует функциональность только на том уровне, на котором она известна на данный момент. Производные же классы ее дополняют. Но, пора перейти от теории к практике. Сразу оговорюсь, рассматривается примитивный пример с минимальной функциональностью. Все объяснения — в комментариях в коде.

abstract class Publication
// таблица, в которой хранятся данные по элементу
protected $table ;

// свойства элемента нам неизвестны
protected $properties = array();

// метод, одинаковый для любого типа публикаций, возвращает значение свойства
public function get_property ( $name )
if (isset( $this -> properties [ $name ]))
return $this -> properties [ $name ];

// метод, одинаковый для любого типа публикаций, устанавливает значение свойства
public function set_property ( $name , $value )
if (!isset( $this -> properties [ $name ]))
return false ;

$this -> properties [ $name ] = $value ;

// а этот метод должен напечатать публикацию, но мы не знаем, как именно это сделать, и потому объявляем его абстрактным
abstract public function do_print ();
>

Производные классы

Теперь можно перейти к созданию производных классов, которые и реализуют недостающую функциональность.

class News extends Publication
// конструктор класса новостей, производного от класса публикаций
public function __construct ( $id )
// устанавливаем значение таблицы, в которой хранятся данные по новостям
$this -> table = 'news_table' ;
// вызываем конструктор родительского класса
parent :: __construct ( $id );
>

// переопределяем абстрактный метод печати
public function do_print ()
echo $this -> properties [ 'title' ];
echo '

' ;
echo $this -> properties [ 'text' ];
echo '
Источник: ' . $this -> properties [ 'source' ];
>
>

class Announcement extends Publication
// конструктор класса объявлений, производного от класса публикаций
public function __construct ( $id )
// устанавливаем значение таблицы, в которой хранятся данные по объявлениям
$this -> table = 'announcements_table' ;
// вызываем конструктор родительского класса
parent :: __construct ( $id );
>

// переопределяем абстрактный метод печати
public function do_print ()
echo $this -> properties [ 'title' ];
echo '
Внимание! Объявление действительно до ' . $this -> properties [ 'end_date' ];
echo '

class Article extends Publication
// конструктор класса статей, производного от класса публикаций
public function __construct ( $id )
// устанавливаем значение таблицы, в которой хранятся данные по статьям
$this -> table = 'articles_table' ;
// вызываем конструктор родительского класса
parent :: __construct ( $id );
>

// переопределяем абстрактный метод печати
public function do_print ()
echo $this -> properties [ 'title' ];
echo '

' ;
echo $this -> properties [ 'text' ];
echo '
© ' . $this -> properties [ 'author' ];
>
>

Теперь об использовании

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

// наполняем массив публикаций объектами, производными от Publication
$publications [] = new News ( $news_id );
$publications [] = new Announcement ( $announcement_id );
$publications [] = new Article ( $article_id );

foreach ( $publications as $publication ) // если мы работаем с наследниками Publication
if ( $publication instanceof Publication ) // то печатаем данные
$publication -> do_print ();
> else // исключение или обработка ошибки
>
>

Вот и все. Легким движением руки брюки превращаются в элегантные шорты :-).

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

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

В объектно-ориентированных языках

В объектно-ориентированных языках класс является абстрактным типом данных. Полиморфизм реализуется с помощью наследования классови виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный вклассе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнениядля экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]
Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.
Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе).Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.
Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников.

Название работы: Полиморфизм и виды его операций

Предметная область: Информатика, кибернетика и программирование

Описание: Полиморфизм Полиморфизм – использование одного и того же имени функции, операции или класса для разных типов данных. Полиморфизм позволяет многократно не переписывать фрагменты программы, реализующие один и тот же алгоритм для разных типов.

Дата добавления: 2012-11-30

Размер файла: 30.97 KB

Работу скачали: 6 чел.

Полиморфизм

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

Полиморфизм используется в так называемых абстрактных классах, предназначенных для описания структур данных: массивов, списков, деревьев и т.д. В качестве параметров таких классов задаются типы элементов структур данных.

Виды полиморфизма

Различают следующие виды полиморфизма:

- полиморфизм функций (переопределение функций)

- полиморфизм операций (переопределение операций)

Полиморфизм операций (переопределение операций)

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

Синтаксис операции похож на синтаксис обычной функции. Главным отличием операции от обычной функции является использование в качестве имени ключевого слова operator и знака переопределяемой операции.

Правила перегрузки операций

1. Можно перегружать любые операции ., *, . . sizeof .

2. Все операции наследуются кроме присваивания.

3. При перегрузке операции с одним операндом она не должна иметь параметров

4. При перегрузке операции с двумя операндами она должна иметь один параметр (ссылку на объект).

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

6 Операции ++ и -- переопределяются в префиксной и постфиксной формах. Для префиксной формы входных параметров нет, для постфиксной – один целочисленный входной параметр.


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

Полиморфизм - Онтогенетический полиморфизм

Онтогенетический полиморфизм

Полиморфизм - Онтогенетический полиморфизм

На примере домовой мухи: 1 – яйца, 2 – личинка, 3 – куколка, 4 – имаго.

Разновидности полиморфизма

Как правило, в основе изменчивости видов лежит воздействие на насекомое различных внешних факторов, которые вызывают те или иные изменения в фенотипе. В зависимости от природы этого воздействия, выделяют несколько форм полиморфизма: [3]

Онтогенетический полиморфизм

Изменение форм, происходящее в процессе индивидуального развития организма. Так, насекомые с полным превращением на протяжении жизни проходят ряд известных стадий: яйцо, личинка, затем куколка и взрослая особь – имаго (фото). Все эти формы существенно отличаются друг от друга по внешнему виду, строению, способу питания и др. [3]

Половой полиморфизм

У большинства насекомых этот вид изменчивости представляет собой диморфизм, так как пол особей в основном бывает представлен одним из двух вариантов – самка или самец. [3] Однако, например, у пчел все несколько иначе: матка имеет женский пол, трутни – мужской, а рабочие пчелы не могут давать потомство и являются бесполыми (или недоразвитыми самками - в их генетическом наборе только одна х-хромосома, а у самки их должно быть две). [2]

Кастовый полиморфизм

У летающих перепончатокрылых сообщество состоит из матки, которая занимается только откладкой яиц, нескольких трутней, оплодотворяющих матку, и рабочих – основной массы членов колонии, которые отвечают за ее жизнеобеспечение. Некоторые виды, например, термиты, имеют более сложную структуру сообщества. У них семья состоит из правящего короля, правящей царицы, второй, третьей царицы, солдат и рабочих. [5]

Полиморфизм может существовать и в пределах одной касты: так, рабочая каста у муравьев-листорезов объединяет до пяти разновидностей: фуражиры, солдаты, разведчики, строители и няньки. [5]

Полиморфизм - Сезонный полиморфизм пестрокрыльницы изменчивой

Сезонный полиморфизм пестрокрыльницы изменчивой

Полиморфизм - Сезонный полиморфизм пестрокрыльницы изменчивой

1 – весенняя генерация, 2 – летняя.

Фазовый полиморфизм

Этим термином определяется внутривидовое разнообразие, зависящее от жизненной фазы насекомых. Некоторые особи, вступая в фазу миграции, размножения или подготовки к зимней спячке, меняют свой внешний облик. [3]

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

Сезонный полиморфизм

Его рассматривают как разновидность экологического, который, в свою очередь, появляется от различий в условиях существования. Внешний вид насекомого зависит от сезонности. [3]

Например, в популяции бабочки-пестрокрыльницы поколения, появившиеся весной, отличаются рыжевато-красной окраской крыльев с характерным расположением темных пятен. В то же время, летняя генерация состоит из особей с коричневыми крыльями. Этот феномен обусловлен тем, что в весеннее время, при более низкой температуре, в организме бабочки вырабатывается меньше темного пигмента, отвечающего за окраску крыльев. [4]

Сезонный полиморфизм очень характерен тропическим насекомым: у многочисленных видов из жарких стран существует разделение на поколения теплого и засушливого сезона – от влажности также зависит протекание многих биохимических процессов. [5] (фото)

Полиморфизм - Индустриальный меланизм

Индустриальный меланизм

Полиморфизм - Индустриальный меланизм

На примере березовой пяденицы: 1 – светлые крылья, 2 – серые крылья; 3 – темные крылья.

Географический полиморфизм

В основном этот вид изменчивости встречается у видов с широким расселением, особенно если отдельные популяции резко отграничены друг от друга. В этом случае размножение особей происходит только внутри популяций, что ведет к появлению внешних различий между изолированными группами насекомых. [3] Так, у обыкновенного аполлона, обитающего на тихоокеанских островах, могут сильно варьировать количество и расположение пятен на крыльях. Энтомологи уже насчитали порядка шести сотен вариантов таких отличий в пределах одного этого вида. [4]

Индустриальный меланизм

Это явление также представляет собой вид экологического полиморфизма. Индустриальным меланизмом называется изменчивость, обусловленная интенсивным развитием промышленности и ухудшением экологической обстановки. [1]

Вблизи крупных промышленных центров обитает большое количество темноокрашенных форм насекомых (в первую очередь, бабочек). Особи с такой окраской лучше сливаются с местностью и потому эффективнее скрываются от хищников. Типичный пример – березовая пяденица. Всего 50 лет назад крылья бабочек этого вида имели преимущественно светлую окраску, сейчас же они гораздо темнее. В настоящее время различают три основных формы бабочек с разной окраской крыльев. (фото) В незагрязненных районах больше светлоокрашенных форм с мелкими пятнами, а там, где деревья лишены лишайников или покрыты копотью, преобладает черный цвет крыльев. Средний вариант представлен крапчатым серым цветом. [1]

Читайте также: