Полиморфизм и динамическое связывание ActionScript 

 

 

Полиморфизм — это возможность, присущая всем настоящим  

объектно-ориентированным языкам программирования, которая заключается в том, что экземпляр 

подкласса может быть использован везде, где допустимо применение экземпляра 

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

«множество форм» — любой объект можно рассматривать как экземпляр собственного 

класса или как экземпляр любого из его суперклассов. 

Напарником полиморфизма является динамическое связывание, гарантирующее, что 

в результате вызова метода над объектом будут выполнены именно те инструкции, 

которые определены в фактическом классе данного объекта. 

В качестве канонического примера полиморфизма и динамического  

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

экране. В этом приложении определен класс Shape с нереализованным методом 

draw ( ): 

public class Shape { 

public function draw ( ) { 

// Реализация метода отсутствует. В некоторых других языках 

// метод draw( ) был бы объявлен с помощью атрибута abstract, 

// который синтаксически обязует подклассы класса Shape 

// предоставить реализацию данного метода. 

Класс Shape имеет несколько подклассов — Circle, Rectangle и Triangle, 

каждый из которых предоставляет собственное описание метода draw ( ): 

public class Circle extends Shape { 

override public function draw ( ) { 

// Код для отрисовки окружности на экране не показан... 

public class Rectangle extends Shape { 

override public function draw ( ) { 

 

// Код для отрисовки прямоугольника на экране не показан... 

public class Triangle extends Shape { 

override public function draw ( ) { 

// Код для отрисовки треугольника на экране не показан... 

Чтобы нарисовать новую фигуру на экране, мы передаем экземпляр класса Circle, 

Rectangle или Triangle в метод addShape ( ) основного класса приложения 

DrawingApp. Код метода addShape ( ) класса DrawingApp выглядит следующим 

образом: 

public function addShape (newShape) { 

newShape.draw( ); 

// Оставшаяся часть метода (код не показан) занималась бы добавлением 

// новой фигуры во внутренний список фигур, отображаемых 

// на экране 

Теперь рассмотрим пример добавления фигуры, представленной классом Circle, 

на экран: 

drawingApp.addShape(new Circlet )); 

Метод addShape ( ) вызывает метод draw ( ) для новой фигуры и добавляет эту 

фигуру во внутренний список фигур, отображаемых на экране. И самое главное — 

метод addShape ( ) вызывает метод draw ( ), не зная (и не заботясь о том),  

экземпляром какого класса является новая фигура — Circle, Rectangle или Triangle. 

Благодаря процессу динамического связывания, происходящему на этапе  

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

Иными словами, если новая фигура является экземпляром класса С i г с 1 е, то среда 

выполнения Flash вызовет метод Circle. draw ( ); если новая фигура является 

экземпляром класса Rectangle, то Flash вызовет метод Rectangle. draw ( ); если 

же новая фигура является экземпляром класса Triangle, то среда Flash вызовет 

метод Triangle. draw ( ). Важно отметить, что на этапе компиляции конкретный 

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

часто называют поздним связыванием: вызов метода связывается с конкретной  

реализацией «с опозданием» (то есть на этапе выполнения). 

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

возможность локализации изменений кода. Полиморфизм позволяет одной части 

приложения оставаться неизменной даже при изменении другой части. Например, 

рассмотрим, каким образом мы могли бы нарисовать фигуры, если бы полиморфизм 

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

каждой версии метода draw ( ): 

public class Circle extends Shape { 

public function drawCircle ( ) { 

 

// Код для отрисовки окружности на экране не показан... 

public class Rectangle extends Shape { 

public function drawRectangle ( ) { 

// Код для отрисовки прямоугольника на экране не показан... 

public class Triangle extends Shape { 

public function drawTriangle ( ) { 

// Код для отрисовки треугольника на экране не показан... 

Далее внутри метода addShape ( ) класса DrawingApp нам бы пришлось  

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

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

Оператор is возвращает значение true в том случае, если указанное выражение 

принадлежит заданному типу данных; в противном случае возвращается значение 

false. Типы данных и оператор is будут рассмотрены в гл. 8. 

public function addShape (newShape) { 

if (newShape is Circle) { 

newShape.drawCircle( ); 

} else if (newShape is Rectangle) { 

newShape.drawRectangle( ); 

} else if (newShape is Triangle) { 

newShape.drawTriangle( ); 

// Оставшаяся часть метода (код не показан) занималась бы добавлением 

// новой фигуры во внутренний список фигур, отображаемых на экране 

Уже сейчас очевидны трудности выбранного подхода. Теперь представьте, что  

произойдет, если мы добавим 20 новых типов фигур. Для каждого нового типа нам 

придется вносить изменения в метод addShape ( ). В мире, где существует  

полиморфизм, нам не пришлось бы изменять код, вызывающий метод draw ( ) над 

каждым экземпляром класса Shape. Поскольку каждый подкласс класса Shape 

предоставляет собственное подходящее описание метода draw ( ), наше  

приложение будет «просто работать» без необходимости внесения других изменений. 

Полиморфизм не только упрощает взаимодействие между программистами, но и  

позволяет применять и расширять библиотеки, не требуя при этом доступа к их  

исходному коду. Некоторые разработчики утверждают, что полиморфизм — это величайший 

вклад объектно-ориентированного программирования в компьютерную науку. 




BACK NEXT

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