Связывание функций
В случае раннего связывания адреса всех функций и процедур определяются на этапе компиляции и компоновки программы, т.е. до выполнения программы.
Вызовы функции: Описания функций:
func_down(); > my_first_metod();
my_metod(); > func_down();
my_first_metod(); > my_metod();
Так, в языке Cи компилятор прежде всего должен найти описание функции по заданному имени.
> описание функции
int my_first_metod(int a, int b)
{
return a + 2*b;
}
.......................
k = my_first_metod(12, 24);
< вызов функции
В противоположность этому, в случае позднего связывания адрес
функции элемента не связывается с обращением к нему до того момента,
пока обращение не произойдет фактически, то есть во время выполнения
программы.
Так в библиотеке Turbo Vision любой объект, порожденный от
TView, должен быть способен к самоизображению в любой момент времени.
Объект TView определяет виртуальную функцию элемент draw, и каждый
порожденный от него объект должен также иметь эту функцию элемент.
Это имеет большое значение, т.к. часто отображаемый объект может быть
закрыт другим отображаемым объектом (или на него может быть наложен
другой отображаемый объект) и когда другой отображаемый объект убирается или смещается, то отображаемый объект должен быть способен к изображению своей части, которая была скрыта.
File Window
Next F6 Demo Window 3
Zoom F5 Demo Window 7
Demo Window 8
Demo Window 1
Demo Window 4
Demo Window 6 Window 2
[*] Demo Window 9 [+]
Alt-X Exit F4 New Alt-F3 Close
Рисунок: программа, написанная с помощью библиотеки Turbo Vision
с множеством открытых окон.
В такой динамической системе нельзя заранее предсказать, сколько
отображаемых объектов будет на экране, каких они будут типов (окно,
меню, диалоговая панель и т.д.) и в какой последовательности пользователь будет с ними работать. В программе, где используется только
ранее связывание, вся информация о количестве, координатах и типах
отображаемых объектов хранится в основной программе. Все возможные
действия над ними тоже должны быть предусмотрены в этой программе.
Таким образом, программе приходится отслеживать очень многое, она
усложняется и теряет гибкость. Стоит добавить один новый тип отображаемого объекта или изменить поведения существующего, и придется
скорректировать программу во всех тех местах, где определяется, какие
подпрограммы подлежат вызову.
Каким же образом можно улучшить положение с помощью позднего
связывания? Рассмотрим случай, когда один отображаемый объект, например, - окно, частично перекрывает другое. Если "верхнее" окно будет
передвинуто или закрыто, то нижнее следует перерисовать для восстановления ранее перекрытой части.
Так как меню окно перерисовывается иначе, чем диалоговая панель
или окно, то каждый объект в отображаемой иерархии должен знать, как
перерисовать себя. В библиотеке Turbo Vision этим занимается функция
элемент draw, имеющийся в каждом объекте-потомке класса TView. Следовательно, если требуется перерисовать объект, то программе не нужно
анализировать, к какому типу отображаемого объекта он относится (как
это требовалось бы при раннем связывании). Она просто вызывает функцию элемент данного объекта draw. Функция исполняется и корректно перерисовывает свой объект на экране. Такая множественность действий, которую может выполнять функция элемент с одним и тем же именем, называется полиморфизмом.
Не смотря на то, что программисты, для достижения полиморфизма
предпочитают использовать позднее связывание, но его можно достичь и
ранним связыванием с помощью переопределяемых функций.