Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 143

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 137 138 139 140 141 142 < 143 > 144 145 146 147 148 149 .. 316 >> Следующая

а самом деле во всех традиционнх языках программирования имеется полиморфизм, неявно присутствуий в определении вра ений языка.
ело в том, что одна и та е операция с аргументами разнх типов реализуется разными командами (процедурами). Это — полиморизм операций, ча-
8.5. ПАРАМЕТРИЗАЦИЯ
407
сто (в особенности в литературе по языкам Алгол 68 и Ada) называемый их перегрузкой. Поскольку, в частности, языки C++ и Java разрешают описание суествуих операций для новых типов аргументов (например, программист сам может поределить операции ввода-вывода << и >>для нового типа даннх), это так е является актуальным не только для системных программистов.
Полиморфизм в широком смысле — возможность выбора конкретной реализации некоторого имени в зависимости от контекста, в котором данное имя появилось. ыбор конкретной реализации полиморфного имени на-звается разреением полиморизма. олиморфизм соответствует омонимии в естественных языках, когда, скажем, 'стекло' понимается совершенно по-разному в синтаксических позициях существительного и глагола. Но даже синтаксическая позиция может не помогать разрешению омонимии, например, для случая слова ' коса'. оэтому в языках с ироко встречаейся омонимией (китайский, японский, английский) переходят к иероглифическому письму12, когда омонимы различаются по написанию .Уже это показывает, насколько обоюдоострым оружием является неограниченный полиморфизм.
В связи с этим в языках программирования различается два вида полиморфизма: тот, который разрешается синтаксически (т. н. раннее связывание реализации с именем), и тот, которй разреается у е в момент исполнения программ (т. н. позднее связывание).
Разработанные методы синтаксического разрешения полиморфизма сводятся в основном к тому, что конкретный вариант процедуры или операции вбирается, исходя из типов ее параметров. ля процедур, кроме того, есть ее и количество аргументов.
Например, если в языке C/C++ заданы три процедуры Role(), Role(Actor), Role(Employee), где Actor и Employee — различные типы данных, то однозначно понятно, какая из них вызывается в следующих трех случаях (solist переменная типа Actor, clerk — типа Employee): Role(); Role(solist); Role(clerk);
о вот если описаны две процедур
Convert(float) Complex и Convert(double) Complex,
12 Многие современные лингвисты трактуют английское письмо как иероглифическое. Например, рассмотрите широко известный ряд слов 'rite', 'write', 'right', 'wright'.
408
ГЛАВА 8. ПОДПРОГРАММЫ
то вызов Convert(15) выглядит двусмысленным, поскольку сначала 15 нуж-но привести к одному из возможных типов аргументов. Конечно, эта двусмысленность разрешается случайными соглашениями конкретного языка, но Вы у е много раз видели, что к этим соглаениям со стратегической точки зрения никогда нельзя привыкать. Так что лучше подобными двусмысленностями не пользоваться.13
Имеется вариант, который признается некорректным практически во всех современных языках с синтаксическим полиморфизмом: процедуры описы-ва тся с одним и тем е числом и одними и теми е типами аргументов, но тип значений у них разне. Конечно е, в контексте явного приведения типов, например,
complex(a+b) и string(a+b)
и такой полиморфизм синтаксически разрешим, но в прочих контекстах при полной неупорядочсенности системы приведений типов он приводит к постоянным конфликтам.
озднее связывание отн дь не обязательно требует глубокого семантического анализа. Оно в рудиментарном виде было реализовано даже на уровне системы команд процессоров Burroughs и Эльбрус, реализующих тегговую архитектуру. Конкретная реализация арифметической операции выбиралась в зависимости от тегов аргументов.
инамическу подстановку методов в объектно-ориентированном программировании можно трактовать как некоторый вариант позднего свзяыва-ния, о чем сказано в соответствующей главе.
Инициализированные параметры языка С++. Очень соблазнительно при описании процедуры задать некоторым формальнм параметрам соот-ветствуие им фактические параметр , которе будут использованы при вызовах в случаях, когда позиция соответствующего фактического параметра не заполнена. Часто (как, например, в Ada, в командных языках, в языке TgX) это оформляется через кл чеву форму параметризации. В С++ такая воз-мо ность реализуется в рамках позиционной формы передачи параметров с учетом их порядка: опускаться могут лишь последние параметры вызова. Задается инициализация параметров помоь конструкции инициализатора,
13 В языке Алгол 68, где приведения типов сведены в наиболее строгую и последователь -ную систему, просто было определено, какие из приведений допустимы при разрешении полиморфизма операций (полиморфизма процедур там нет).
8.5.
409
которая является обычной для задания начальных значений лбх переменных. Это связано с тем, что параметризация данного языка подчиняется механизму передачи параметров по значению, а значит, описание формальных параметров ничем не отличается от обычного описания локальнх переменных.
аличие инициализированных параметров позволяет вызывать одну и ту же функцию с разным числом аргументов, что внешне похоже на полиморфизм. Так,
Предыдущая << 1 .. 137 138 139 140 141 142 < 143 > 144 145 146 147 148 149 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100