Аскандиров
А.Б., Астапенко Н.В.
Северо-Казахстанский
Государственный Университет им.М.Козыбаева, Республика Казахстан
Анализ особенностей полиморфизма
Полиморфизм – одна из трех основных
парадигм ООП. Если говорить кратко, полиморфизм – это способность объекта
использовать методы производного класса, который не существует на момент
создания базового. Если мы разделим этот термин на две части, то обнаружим, что
поли означает много, а морфизм относится к изменению формы. Полиморфный объект,
следовательно, представляет собой объект, который может принимать разные формы.
Для тех, кто не особо сведущ в ООП, это, наверно, все звучит сложно.
В более общем смысле, концепцией полиморфизма является идея "один
интерфейс, множество методов". Это значит, что можно создавать общий
интерфейс для группы близких по смыслу действий. Преимуществом же полиморфизма
является то, что он помогает понижать сложность программ, разрешая
использование того же интерфейса для задания единого класса действий. Выбор же
конкретного действия, в зависимости от ситуации, возлагается на компилятор.
Вам, как программисту, не нужно делать этот выбор самому. Нужно только помнить
и использовать общий интерфейс.
Полиморфизм может применяться также
и к операторам. Фактически во всех языках программирования ограниченно
применяется полиморфизм, например, в арифметических операторах. Так, в С,
символ + используется для складывания целых, длинных целых, символьных
переменных и чисел с плавающей точкой. В этом случае компилятор автоматически
определяет, какой тип арифметики требуется. В С++ вы можете применить эту
концепцию и к другим, заданным вами, типам данных. Такой тип полиморфизма
называется перегрузкой операторов (operator overloading).
Ключевым в понимании полиморфизма является
то, что он позволяет вам манипулировать объектами различной степени сложности
путём создания общего для них стандартного интерфейса для реализации похожих
действий.
B первые термины «специализированный
полиморфизм» и «параметрический полиморфизм» упоминаются в 1967 году в конспекте
лекций под названием «Фундаментальные основы языков программирования»
Кристофера Стрэчи. В 1985 году Лука Карделл и Питер Вегнер предложили термин
«полиморфизм включения» для моделирования подтипов и наследования, но
реализации наследования и подтипов появились намного раньше, в языке Симула в
1967 году.
Нотацию параметрического полиморфизма как
развитие лямбда-исчисления (названную полиморфным лямбда-исчислением или
Системой F) формально описал Джон С. Рейнольдс, и независимо от него Жан-Ив
Жирар. Первым языком, целиком основанным на полиморфном лямбда-исчислении, был
ML (1973 год); независимо от него параметрические типы были реализованы в CLU
(1974 год). Многие современные языки (С++, Java, C#, D и другие) предоставляют
параметрические типы в форме, более или менее близкой к их реализации в CLU.
Если параметру функции сопоставлен ровно
один тип, то такая функция называется мономорфной. Многие языки
программирования предоставляют синтаксический механизм для назначения
нескольким мономорфным функциям единого имени (идентификатора). В этом случае,
в исходном коде становится возможным осуществлять вызов функции с фактическими
параметрами разных типов, но в скомпилированном коде фактически происходит
вызов различных функций. Стрэчи назвал такую возможность ad hoc полиморфизмом
(в русской литературе чаще всего переводится как специальный полиморфизм).
Если параметру функции сопоставлено более
одного типа, то такая функция называется полиморфной. Разумеется, с каждым
фактическим значением может быть связан лишь один тип, но полиморфная функция
рассматривает параметр на основе поведения (в частности, его структуры – но не
в смысле представления в памяти, а в смысле взаимной организации компонентов
структурного типа). В этом случае одно и то же алгоритмическое действие
работает с объектами различных типов. Стрэчи назвал такую возможность
параметрическим полиморфизмом. Сильно типизированные языки предусматривают
возможность описания параметрический полиморфных типов, позволяющих производить
статический контроль безопасности использования полиморфных функций.
Полиморфный тип синтаксически записывается посредством переменной типа –
контекстного идентификатора, пробегающего множество типов.
Литература:
1. Понамарев Вячеслав Программирование на
C++ в Visual Studio .NET 2003; Книга по Требованию - Москва, 2004. - 340 c.;
2.Майо Джо Microsoft Visual Studio 2010. Самоучитель; БХВ-Петербург - Москва, 2010. - 450 c.
3. Сидорина Татьяна Самоучитель Microsoft
Visual Studio C++ и MFC; БХВ-Петербург - Москва, 2009. - 848 c.