Руководство по actionscript. часть 1, стр. 113

Описанные для студентов мужского пола, ничем не отличаются от операций, описанных для студентов женского пола, и, следовательно, должны использоваться одинаково. В данном случае иерархия реального мира конфликтует с иерархией нашего приложения. Если вам необходима информация о поле, лучше создать один класс Student и добавить переменную gender в класс Person. Насколько бы это ни было заманчивым, мы должны избегать создания структур наследования, основываясь исключительно на реальном мире, а не на требованиях нашей программы.

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

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

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

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

В качестве канонического примера полиморфизма и динамического связывания можно привести графическое приложение, отображающее фигуры на экране. В этом приложении определен класс 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 Circle( )):

Метод addShape ( ) вызывает метод draw ( ) для новой фигуры и добавляет эту фигуру во внутренний список фигур, отображаемых на экране. И самое главное — метод addShape ( ) вызывает метод draw ( ), не зная (и не заботясь о том), экземпляром какого класса является новая фигура — Circle, Rectangle или Triangle. Благодаря процессу динамического связывания, происходящему на этапе выполнения программы, среда Flash использует подходящую реализацию данного метода. Иными словами, если новая фигура является экземпляром класса Circle, то среда выполнения Flash вызовет метод Circle. draw ( ); если новая фигура является экземпляром класса Rectangle, то Flash вызовет метод Rectangle. draw ( ); если же новая фигура является экземпляром класса Triangle, то среда Flash вызовет метод Triangle. draw ( ). Важно отметить, что на этапе компиляции конкретный класс добавляемой фигуры неизвестен. По этой причине динамическое связывание часто называют поздним связыванием: вызов метода связывается с конкретной реализацией «с опозданием» (то есть на этапе выполнения).

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

Оставить комментарий

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

Полезные ссылки
Случайные записи
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 117
  • 07.03.2011">Руководство по actionscript. часть 4, стр. 108
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 129
  • 16.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.13
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 097
  • 28.02.2011">Руководство по actionscript. часть 6, стр. 004
  • 20.07.2010">Распространенные недочеты веб-дизайнеров
  • 14.03.2011">Руководство по actionscript. часть 3, стр. 087
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 105
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.15
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.80
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.113
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 114
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 132
  • 05.11.2012">Gmail стал самым популярным почтовым сервисом в мире
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...