
-
Полиформизм
Полиформизм - способность объекта реагировать на запрос (вызов метода) сообразно своему типу, при этом одно и то же имя метода может использоваться для различных классов объектов.
Полиформизм в сочетании с поздним связыванием весьма продуктивная идея.
Термины «раннее связывание» и «позднее связывание» относятся к этапу, на котором обращение к процедуре связывается с ее адресом. В случае раннего связывания адреса всех функций и процедур известны в тот момент, когда происходит компиляция и компановка программы. Это позволяет приписать каждому обращению к процедуре соответствующий адрес. В противоположность этому, в случае позднего связывания адрес процедуры не связывается с обращением к ней до того момента, пока обращение не произойдет фактически, т.е. во время выполнения программы.
Вернемся к нашему примеру с окнами. Нельзя заранее предсказать сколько окон будет на экране, каких они будут типов (Меню, Редактор и т.д.) и в какой последовательности пользователь будет с ними работать. В программе, где используется только ранее связывание, вся информация о количестве, координатах и типах окон хранится в основной программе.
Все возможные действия пользователя под окнами тоже должны быть предусмотрены в этой программе. Каждый раз, когда пользователь производит какие то действия с окном (будь то Редактор, Поле приглашения или что другое), программа должна разобраться, что именно и с каким именно окном произошло, и вызвать соответствующие процедуры для выполнения подлежащих действий с этим окном. Таким образом, программе приходится отслеживать очень многое, она усложняется и теряет гибкость. Стоит добавить один тип окна или изменить поведения одного из окон, и придется скорректировать программу во всех тех местах, где определяется, какие подпрограммы подлежат вызову.
Рассмотрим каким образом можно улучшить положение с помощью позднего связывания. Пусть одно окно частично перекрывает другое. Если «верхнее» окно передвинуто или закрыто, то нижнее следует перерисовывать для восстановления ранее перекрытой части.
Так как меню перерисовывается иначе, чем поле или редактор, то каждый объект в оконной иерархии должен знать, как перерисовать себя. Таким образом, в каждом классе будет своя функция - член, которая перерисовывает данный объект на экране. Следовательно, если требуется перерисовать объект, то программе не нужно анализировать к какому типу окна он относится (как это требовалось бы при раннем связывании). Она просто вызывает функцию - член данного объекта «Перерисовка» Объект исполняет эту свою функцию и корректно перерисовывает себя на экране.
Если пакет содержит семь типов окон, то в нем будет семь различных правил перерисовки, но все они будут называться «Перерисовка», но для каждого объекта это делается по своему, так как это нужно именно для него. Эта множественность форм, которые может принимать правило с одним и тем же именем, называется полиформизмом (греч. Многообразие). Программисту надо заботиться только о том, чтобы указать требуемое действие, а не о том, как это действие выполнить.
Один из самых ранних и наиболее известных объектно ориентированных языков программирования Smalltalk. Позднее появились Turbo C + +, BORLAND C+ +, Turbo Pascal.