|
|||||||||||||||||||
|
Виртуальные методы и полиморфизмМетоды, обсуждаемые выше являются статическими. Они являются статическими по той же причине, по которой статические переменные являются статическими: компилятор размещает их и разрешает ссылки на них во время компиляции. Как Вы видите, объекты и статические методы могут быть мощным средством для организации сложных программ. Однако, иногда они являются далеко не лучшим способом для обработки методов. Проблемы, описанные в предыдущем разделе, обусловлены разрешением ссылок на методы во время компиляции. Способ решения этой проблемы - стать динамическими - и разрешать такие ссылки во время выполнения. Для того, чтобы такое стало возможным, нужны особые механизмы, а 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 программирование: Бурлаков Михаил