Связь и интернет Архив Программирование
   
Сделать стартовойСделать закладку            
   ПОИСК  
   
Главная / Pascal и Delphi / Borland Pascal / Объектно-ориентированное программирование /
8  Perl
8  PHP
8  JavaScript
8  HTML
8  DHTML
8  XML
8  CSS
8  C / C++
8  Pascal и Delphi
8  Турбо Ассемблер
8  MySQL
8  CASE-технологии
8  Алгоритмы
8  Python
8  Обратная связь
8  Гостевая книга
Новости о мире


Полиморфизм - Программирование от RIN.RU
Полиморфизм

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


Однако иногда это не лучший способ для управления методами.


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


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


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


Каждый тип объекта в нашей иерархии представляет отдельный тип фигуры на экране: крылатое насекомое или пчелу. Определенно, имеет смысл сказать, что вы можете показать на экране точку или окружность. Позднее, если вам понадобится определить объекты для представления на экране других типов крылатых насекомых, таких как мотыльки, стрекозы, бабочки и т.д., вы могли бы написать метод для каждого из них, который будет выводить объект на экран. В новых терминах объектно-ориентированного программирования вы могли бы сказать, что все эти типы крылатых насекомых имеют способность показать самих себя на экране. Это большая часть из того, что является для них общим.


Что является особым для каждого типа объекта, так это способ, которым он должен показать самого себя на экране. Например, у пчелы на экране должны рисоваться черные полоски на туловище. Можно показать на экране любой тип крылатых насекомых, но механизм рисования каждого является сугубо специфическим. Одно слово "нарисовать" используется для рисования (буквально) многих крылатых насекомых. Аналогично, если вернуться к нашему примеру платежной ведомости, то слово "GetPayAmount" вычисляет размер выплат для нескольких категорий работающих.


Это были примеры полиморфизма, а виртуальными методами является то, что реализует его в Borland Pascal.


Раннее связывание против позднего связывания


Различие между вызовом статического метода и динамического метода является различием между решением сделать немедленно и решением отложить. Когда вы кодируете вызов статического метода, вы по существу говорите компилятору; "Ты знаешь, чего я хочу. Пойди и вызови это." С другой стороны, применение вызова виртуального метода, подобно разговору с компилятором; "Ты не знаешь пока, чего я хочу. Когда придет время, задай вопрос о конкретном экземпляре."


Подумайте об этой метафоре в терминах проблемы MoveTo, упомянутой в предыдущем разделе. Вызов TBee.MoveTo может привести только к одному - выполнению MoveTo, ближайшей в объектной иерархии. В этом случае TBee.MoveTo по-прежнему будет вызывать определение MoveTo для TWinged, так как TWinged является ближайшим к TBee типом вверх по иерархии. Если предположить, что не определен никакой дочерний тип, который определяет собственный метод MoveTo, переопределяющий MoveTo типа TWinged, то любой порожденный по отношению к TWinged тип будет по-прежнему вызывать тот же самый экземпляр метода MoveTo. Решение может быть принято во время компиляции и это все, что должно быть сделано.


Однако совсем другое дело, когда метод MoveTo вызывает Show. Каждый тип фигуры имеет свой собственный экземпляр Show, поэтому то, какой экземпляр Show вызывается методом MoveTo, полностью зависит от того, какая реализация объекта вызывает MoveTo. Именно поэтому решение о вызове метода Show внутри экземпляра MoveTo должно быть отложено: при компиляции кода MoveTo не может принято никакого решения относительно того, какой метод Show должен быть вызван. Эта информация недоступна во время компиляции, поэтому решение должно быть отложено до тех пор, пока программа не начнет выполняться, и пока нельзя будет запросить экземпляр объекта, вызывающий MoveTo.


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


Сущность механизма интересна и тонка, и немного позднее вы увидите, как он работает.



 8  Комментарии к статье  8 8  Обсудить в чате

8  В тему

Объекты

Наследование

Объекты: наследующие записи

Tехника программирования

Методы

Совмещенные код и данные

Определение методов

Объекты и модули

Программирование в "действительном залоге"

Инкапсуляция

Методы: никакого ухудшения

Расширяющиеся объекты

Cтатические методы

Совместимость типов объектов

Полиморфические объекты

Виртуальные методы

Вызов виртуальных методов

Статические или виртуальные методы?

Динамические объекты

Размещение и инициализация

Удаление динамических объектов

Деструкторы

Пример размещения объекта

Что же дальше?

 
  
  
    Copyright ©  RIN 2003 - 2004      * Обратная связь