Понятие о статическом и динамическом связывании.
Полиморфизм как средство разработки классов
При создании иерархии классов может обнаружиться, что некоторые свойства объектов, сохраняя название, изменяются по сути. Для реализации таких иерархий в языке программирования должен быть предусмотрен механизм полиморфизма, обеспечивающийвозможностьзадания различных реализаций некоторого единого по названию метода для классов различных уровней иерархии. В ООП такой полиморфизм называется простым, а методы, имеющие одинаковое название - статическими полиморфными. Совокупность полиморфных методов с одним именем для иерархии классов образует единый полиморфный метод иерархии, в котором реализация полиморфного метода для конкретного класса представляет отдельный аспект.
Различают несколько терминов, связанных с конкретными механизмами реализации полиморфизма для различных случаев:
1) чистый полиморфизм - используется для обозначения того, что один код функции может по-разному интерпретироваться в зависимости от типа аргументов; используется в языках высокого уровня абстракции, например, в языке Lisp или Smalltalk;
2) перегрузка (полиморфные имена функций) - используется, когда определяется несколько функций с одним именем - одно и то же имя функции может много кратно использоваться в разных местах программы; выбор нужной функции может определяется типами аргументов, областью видимости (внутри модуля, файла, класса и т.д.); если выбор определяется типом аргументов, то перегрузка называется параметрической; например, язык С++ позволяет разработчику выполнять параметрическую перегрузку функций вне классов;
3) переопределение - используется в ООП при необходимости задания различных реализаций одноименных методов в иерархии классов; различают:
а) простой полиморфизм – конкретный метод определяется типом объекта при компиляции программы (раннее связывание); одноименные методы при использовании простого полиморфизма называются статическими полиморфными;
б) сложный полиморфизм (полиморфные объекты) – конкретный метод определяется типом объекта при выполнении программы (позднее связывание); одноименные методы при использовании сложного полиморфизма называются виртуальными полиморфными (рассмотрены далее);
4) обобщенные функции или шаблоны - используется в ООП при реализации в языке параметризованных классов (например, в С++), параметрами такого класса являются типы аргументов методов класса (рассмотрены далее).
Связыванием называется привязка тела ф-ии или процедуры к месту ее вызова в главной программе или в другой процедуре или ф-ии. В процедурных языках задача связывания решается на этапе компиляции. Если определенная ф-я находится в том же модуле, что и обращение к ней или на этапе компоновки если определ ф-ия находится в другом модуле. Этап компоновки назыв редактированием связей. В этом случае на момент выполнения программы для каждого вызова ф-ии точно известен адрес ее вызова. Такое связывание называют ранним или статическим. При этом связывании используются типы , известные во время компиляции программы . В программах на ОО языках переменная – указатель на любой объект базового типа может быть связан с объектом производного типа. Это делать невозможно. Установление в момент компиляции или компоновки программы, действительного вида метода, кот. Необходимо вызвать заключается в том, что ф-я, аргументом которой явл-ся указатель на объект базового класса, может принять в кач-ве значения указатель на объект производного класса, но не позволяет обратиться к полям и методам производного класса, Принцип связывания при котором все решения относительно типов объектов принимают на стадии компиляции недостаточен для реализации концепции наследования. Решение проблемы заключ в использовании динамического позднего связывания . В этом случае определение конкретного метода производного класса может происходить не во время компиляции, а во время выполнения программы, Если язык поддерживает динамическое связывание он должен иметь средства, позвол определить тип объекта во время выполнения программы и вызвать подходящий метод в зависимости от этого типа. В Pascal эти средства основываются на виртуальных динамических методах.