Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[1]

Параметрический полиморфизм получается при использовании шаблонных функций ( функция выполняет свой алгоритм на некотором диапозоне типов эти типы обладают определенной общей структурой).Перегрузка (ad-hoc polymorphism) проявляется ,когда функция работает с несколькими разными типами ( у которых может быть ничего общего) и может себя вести себя по-разному для каждого типа.

Наша классификация полиморфизма , представленная на рисунке 1 улучшает Strachey , вводя новую форму полиморфизма ,называемый полиморфизмом включения ,для моделирования выделения подтипов и наследования. Параметрический полиморфизм и полиморфизм включения классифицированы как две главных подкатегории универсального полиморфизма ,которыйпротивопоставлен неуниверсальному полиморфизму (перегрузке).Рисунок 1 отражает точку зрения Strachey на полиморфизм ,но еще добавляет полиморфизм включения для моделирования объектно-ориентированных языков. Параметрический полиморфизм так называется так как единообразность структур типов обычно достигается с помощбю параметров ,но единообразность может быть достигнута разными способами и эта более общая концепция называется универсальным полиморфизмом.Универсльно полиморфные фукнции будут нормально работать на бесконечном числе типов (все типы имеет некоторую общую структуру) , перегруженные же функции будут работать только на конечном множестве разных потенциально несвязных типах. В случае универсального полиморфизма можно с уверенностью заявить ,что некоторые значения ( то есть полиморфные функции) имеют много типов , когда как в перегрузке это трудно поддерживать , а можно утверждать ,что функции перегрузки это маленькое подмножество мономорфных функций.В терминах реализации универсальные полиморфные функции будут выполнять один и тот же код для аргументов всех допустимых типов ,тогда как перегруженные функции могут исполнять разный код для каждого типа аргументов.

Есть два типа универсального полиморфизма ,то есть два способа ,в которых значение может иметь много типов. В параметрическом полиморфизме полиморфная функция имеет явный и неявный парметр типа ,который определяет тип аргумента для каждого применения этой функции.В полиморфизме включения объект может быть представлен как принадлежащий многим различным классам , которые не должны быть отдельными , то есть может быть вложение классов. Эти два представления универсального полиморфизма являются связанными , но они достаточно отличаются .

Функции обладающие параметрическим полиморфизмом ,также называются шаблонными функциямиНапрмер,функция длины (length) принимающая на вход список произвольных типов и возвращающая целое число называется шаблонной функцией длины.Шаблонная функция это та функция ,которая может работать с аргументами различных типов ,в общем случае проделываю одну и ту же работу независимо от типа аргумента.

Есть также два типа перегрузочного полиморфизма.В перегрузке одно и тоже имя определяет несколько разных функций и какая функция определена конкретным именем можно понять по контексту .Мы можем представить ,что препроцессор программы уберет перегрузку ,дав различные имена различным функциям,в этом смысле перегрузка это удобное синтаксическое сокращение. Приведение типов это наоборот семантическая операция,в которой надо конвертировать аргумент к типу ,который ожидает функция на входе, иначе бы такая мситуация вызвала бы ошибку .Приведения типов может проводиться статичсеки- во время компилиции будут приводится типы аргументов и функций или динамически - во время выполнения программы.

Различие между перегрузкой и привидением неясно в некоторых ситуациях.Это в частности верно ,когда мы рассматриваем безтиповый язык или интерпретируемый язык. Но даже в статических компилируемых языках могут быть непонятности между двумя формами перегрузочного полиморфизма.Например,


3+4 3.0 + 4 3 + 4.0 3.0 + 4.0

Здесь перегрузочный полиморфмизм + может быть объяснен следующим способом.

-Оператор + имеет 4 прегруженные значения , один для каждой комбинации типов аргументов.

-Оператор + имеет 2 перегруженных значения , котороые соответствуют сложению целых и действительных чисел.Где один из аргументов это целое число ,а другой это действительное,в этом случае целое число приводится к типу действительного.

-Оператор + определен только для сложения действительных чисел и целые аргументы всегда будут приводится к значениям действительных чисел. В этом примере мы рассматриваем выражения ,представляющие прегрузку и приведение и оба сразу в зависимости от решения реализации.

Если мы представляем тип как определение (правило) поведения или использования ассоциированных с типом значений ,тогда мономорфная система типов огрнаичивает объект на определения только одного поведения , когда как полиморфная система типов позволяет ассоциировать знеачения с более чем одним поведением. Мономорфные языки очень ограниченв по своей выразительной силе ,так как они не позволяют значениям или даже синтаксическим символам , которые определяют значения иметь различные поведения в различных контекстах использования. Такие языки как Паскаль и Ада имеют способы ослабления строгого мономорфизма , но полимрфизм скорее исключение нежели правило и мы можем сказать ,что они почти мономорфные.Реальные и мнимые исключения из мономорфной типизации в обычных языках включают в себя:

(1)Перегрузка : целые константы могут быть как типа integer так и типа real. Операции такие как + применими аргументам как типа Integer так и типа real.

(2)Приведение типов: значения типа integer могут использоваться там же где и значения типа real и наоборот.

(3)Выделение подтипов: элементы принадлежащие к поддиапозону типов , принадлежат также к диапозону типов содержащий этот поддиапозон.

(4)Совметсное использование значений: nil в Паскале это константа ,которая совместно используется всеми типами указатель.

Эти 4 примера ,которые могут все существовать в одном и том же языке это примеры четырех радикально различных способа расширения мономорфной системы типов.Давайте посмотрим как они подходят под различные типы полиморфизма.

Перегрузка это чисто синтаксический способ использования одного и того же имени для различных семантических объектов ; компилятор может разрешить неопределенность во время компиляции и дальше работать как обычно.

Приведения типов позволяет пользователю опускать необходимые преобразования типов.Необходимые преобразования типов должны определяться системой , внедрены в программу и использованы компилятором для генерации требуемых преобразований типов. Приведение типов это некоторая форма упрощения ,которая может уменьшить размер программы и улучшить читаемость программы ,но также оно может стать причиной незаметной и подчас опасной ошибки. Необходимость приведений типов во времени исполнения программы обычно определяется во время компиляции ,но такие языки как Lisp имеют множество приведений ,которые распознаются и обрабатываются только во время исполнения.

Выделение подтипов это случай полиморфизма включения.Идея о типе ,который является подтипом другого типа не только из-за подиапозона упорядоченных типов таких как integer ,но также и для других сложных структур ,таких как например тип Тойота , который является подтипом типа Транспортное средство.Каждый объект


подтипа может быть использован в контексте супертипа в том смысле ,что каждая Тойота это транспортное средство и она подчиняется тем же операциям каким подчиняются все транспортные средства.

Совместное использование значений это частный случай параметрического полиморфизма.Еам може казаться ,что символ nil был перегружен ,но это было бы странной неокончательной перегрузкой ,так как nil это действительный элемент в бесконечном наборе типов ,которые еще не были объявлены.Более того все использования элемента nil ,указывают на одно и тоже значение , но это не общий случай для перегрузки. Мы также можем подумать ,что есть различные nil для различных типов , но все эти nil имеют одинаковое представление и могут быть объелинены. Тот факт ,что объект имеющий много типов единообразно представляеьтся для всех типов это характеристика параметрического полиморфизма.

Как эти ослабленные формы типизации относятся к полиморфизму?Универсальный полиморфизм считается правильным полиморфизмом ,тогда как перегрузочный полиморфизм в некотором смысле мнимый полиморфизм ,чье характерные полиморфные особенности исчезают при близком рассмотрении. Прегрузка это неправильный полиморфизм,вместо того чтобы значение имело много типов ,мы позволяем символу иметь много типов,но значения определяемые этими символами имеют различные и возможно несовместимые типы.Также приведение типов не дает правильного полиморфизма,может казаться ,что оператор принимает значения многих типов ,но значения должны быть приведены к некоторму представлению , прежде чем оператор сможет их использовать. ,поэтому опрератор работате только с одним типом. Более того выходной тип больше на зависит от входного типа ,как в случае параметрического полиморфизма.

В противоположность к перегрузке и приведению подтипов ,выделение подтипов это пример правильного полиморфизма: объектом подтипа можно единообразно манипулировать так елси бы он принадлежал к супертипам.В раелизации представление выьирается очень тщательно ,поэтому не надо использовать приведение типов используя объект подтипа в месте ,где используется объект супертипа.В этом смысле одинаковые объекты имею много типов(например в Симуле член подкласса может иметь боший сегмент памяти нежели член его суперкласса а его начальный сегмент имеет ту же структуру как и член супрекласса). Также опреации тщательно выбираются ,чтобы они могли единообразно представлять элементы подтипов и супертипов.

Параметрический полиморфизм это чистейшая форма полиморфизма; один и тот же объект или функция может испльзоваться единообразно в различных контекстах без изменений ,приведений или любых проверок времени выполнения. Однако следует заметить ,чтоэта единообразность поведения требует ,чтобы все данные были представлены единообразно.

Четыре рассмотренных способа ослабления мономорфной типизации становятся более мощными ,когда мы рассматриваем их в связке с операторами ,функциями и процедурами.Давайте рассмотрим некоторые примеры. Символ + может быть перегружен для использования в одно и тоже время в качестве суммы типов integer ,типов real ,типов string.Использование одного и того же символа для этих трех операций отражает приблизительные похожесть алгебраической структуры ,но нарушает требование мономорфности.Противоречивость может быть устранена типами операндов в перегруженном операторе ,но этого может быть недостаточно. Например ,если 2 перегружено для определения целого 2 и действительного 2 ,то 2+2 останется неопределенным и разрешается это только присваиванием типовой переменной.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13]