Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

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


 Предыдущая страница     |     Следующая страница  
Добавить в избанное Обсудить в форуме Написать автору сайта

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

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

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

      Важно!

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

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

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

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

     Можно изобразить   любую  графическую  фигуру,   но  механизм, посредством которого изображается каждая фигура предопределен. Одно слово "Show", используется для изображения многих форм.      Это хороший пример того, что представляет собой полиморфизм, а виртуальные методы это то, как он реализуется в Turbo Pascal.

[начало] [оглавление]

 

Раннее связывание по сравнению с поздним связыванием.

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

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

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

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

     Природа этого  механизма интересна и хитроумна,  и Вы увидите, как она работает немного позднее.

[начало] [оглавление]


Предыдущая страница     |     Следующая страница


Добавить в избанное Обсудить в форуме Написать автору сайта

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz