Читайте также:
|
|
Полиморфизм – это концепция ООП. В общем случае это означает возможность принимать множество форм. В программировании же это означает, возможность метода, реализованного для объекта указанного класса, вызываться автоматически, используя одну переменную для доступа к объектам разных классов посредствам механизма динамического связывания.
Рассмотрим пример. Предположим, что необходимо создать программу, которая позволила бы создать геометрические фигуры (круг, треугольник, прямоугольник).
Вначале постараемся определить классы, которые понадобятся в программе. Для этого перефразируем предложения, выделяя существительные: Чертеж состоит из набора фигур ( Shape ). Фигура может быть окружностью ( Circle ), прямоугольником ( Rectangle ), треугольником ( Triangle ) и т. д. Соответственно, нужно реализовать класс Shapeи несколько подклассов. В данном случае достаточно ограничиться тремя подклассами: Circle, Rectangle и Triangle, как показано на рисунке.
По мере того как необходимо добавлять фигуры к чертежу, в программе создаются соответствующие объекты Shape(в данном случае Circles, Rectangles и Triangles ). Свойства каждого объекта Shapeсохраняются внутри него. Для хранения объектов необходимо создать соответствующий массив.
Как же разные объекты могут быть размещены в одном массиве, если все его элементы должны иметь один тип? Поскольку Circle, Squareи Triangle— потомки Shape, любой из объектов этих трех типов может быть помещен в переменную типа Shape. Чтобы нарисовать объект, можно было бы написать метод в отдельном классе DrawingMachineи назвать его MakeDrawing. Этот метод перебирал бы объекты в массиве, просматривал значения их переменных экземпляра и определял позицию, размер и форму объекта. Такой подход был бы неудобен, поскольку параметры и алгоритмы рисования объектов различны. Например, окружности нужен радиус и координаты центра, прямоугольнику — высота и ширина, а более замысловатым формам может понадобиться и большее число параметров.
Здесь и стоит обратиться к полиморфизму. Полиморфизм позволяет реализовать следующую методику: вместо того, чтобы разбираться извне, как следует рисовать каждый объект, стоит позволить объекту самому поддерживать свой алгоритм рисования. Каждый объект будет инкапсулированным пакетом, содержащим данные и действия, необходимые для его отображения. Назовем метод, выводящий объект на экран, DrawYourself. Он нужен объекту любой формы, поэтому его необходимо объявить в классе Shape. Однако, неизвестна реализация DrawYourselfдля Shape. Поэтому DrawYourselfнужно объявить abstractв классе Shape, а затем включить его реализацию в каждом из трех подклассов.
Напомним, что абстрактный метод одновременно виртуален, и если переопределить DrawYourselfв каждом классе, производном от Shape, сработает механизм динамического связывания. Это означает, что для рисования объектов достаточно просто вызывать метод DrawYourselfкаждого из них. Механизм динамического связывания определит, Какого типа объект хранится в каждом элементе массива, и автоматически вызовет соответствующий метод DrawYourself.
Следует отметить, что DrawYourselfобъявлен abstractв классе Shape и переопределен в каждом из трех подклассов. Подклассы просты и не содержат информации о положении или размерах. Они просто выводят фигуру на экран.
Несмотря на то для переменной вызывается один и тот же метод DrawYourself из переменной myShape, благодаря механизму динамического связывания в каждой из них исполняется своя реализация метода DrawYourself. При вызове myShape.DrawYourself() программисту не приходится задумываться, какой объект хранится в myShape, и о других деталях. Полиморфизм позволяет рисовать чертеж на высоком уровне абстракции.
Дата добавления: 2015-10-23; просмотров: 104 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Перегрузка методов. Вызов методов с одинаковым именем и разными аргументами | | | Вопрос 14 Потеря и восстановление информации о типе. Операторы is и as. |