Назад Вперед Содержание

Полиморфизм 

В общем случае слово полиморфизм означает «много форм» или способность объекта изменять форму.

Полиморфизм в терминах программирования означает, что метод с одним названием может осуществлять множество вариантов поведения.

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

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

Каждый объект, с которым используется это слово, придает ему особое значение. Однако во всех случаях для описания действия используется одно и то же слово – открыть.

Полиморфизм в программировании

Объекты дочернего класса могут вызывать методы родительского класса. Они их наследуют.

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

Целью полиморфизма является использование одного имени для задания общих для класса действий.

То есть способность одного и того же программного текста x.M() выполняться по-разному, в зависимости от того, с каким объектом связана сущность x.

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

Полиморфизм реализуется через виртуальные и абстрактные методы.

Пример обычного наследования

Мы создавали класс Triangle, описывающий треугольник по трем его сторонам. Этот класс будет родительским.

В этом классе был метод Perimeter вычисляющий периметр и метод Print, выводящий значения полей на экран.

Можно создать дочерний класс Equilateral, описывающий равносторонний треугольник по его одной стороне.

Объекты этого класса унаследуют этоти методы и могут их использовать:

Связывание

Связывание – передача адреса метода при его вызове (в то место, откуда вызывается метод).

При вызове метода по его имени должно вызываться его тело. Программисты называют этот процесс связыванием.

Связывание, то есть передача адреса, происходит:

  1. либо в процессе компиляции,
  2. либо во время выполнения программы.

Раннее связывание

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

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

Это дает преимущество по сравнению с поздним связыванием.

Позднее связывание

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

Позднее связывание реализуется с помощью виртуальных методов.

В случае виртуального метода компьютер «обманывается» определением метода, но на самом деле метод на тот момент не определен. Виртуальный метод выступает как «заполнитель» реального метода.

Реальный метод определяется во время выполнения программы.

Общий пример

Создадим класс Shape описывающий плоские фигуры. Этот класс будет родительским.

В этом классе будет Point -центр фигуры, метод moveTo(Point point) ,перемещающий центр фигуры в другую точку,и возвращающий длину перемещения,виртуальный метод Area(), вычисляющий площадь, который будет переопределяться вдочерних классах и метод Border() , вычисляющий границу фигуры, который будет скрываться методом дочернего класса и помечаться new.

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

Ключевое слово new вставляется перед типом возвращаемого значения замещаемого члена класса.

Cоздаем два дочерних классы Circle и Square, описывающих круг(добавлен радиус) и квадрат(добавлена сторона).

Объекты этого класса унаследуют метод moveTo (раннее связывание) и могут их использовать, метод Area() и Border()( позднее связывание):

Объекты дочернего класса могут вызывать методы родительского класса. Они их наследуют.

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

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

Назад Вперед Содержание