Одно правило и несколько определений
Одно правило и несколько определений
Правило типов для решения Кэтколл имеет простую формулировку:
Правило типов для Кэтколл
Полиморфные кэтколлы некорректны.
В его основе - столь же простые определения. Прежде всего, полиморфная сущность:
Определение: полиморфная сущность
Сущность x ссылочного (не развернутого) типа полиморфна, если она обладает одним из следующих свойств:
1 Встречается в присваивании x := y, где сущность y имеет иной тип или по рекурсии полиморфна.
2 Встречается в инструкциях создания create {OTHER_TYPE} x, где OTHER_TYPE не является типом, указанным в объявлении x.
3 Является формальным аргументом подпрограммы.
4 Является внешней функцией.
Цель этого определения - придать статус полиморфной ("потенциально полиморфной") любой сущности, которую при выполнении программы можно присоединить к объектам разных типов. Это определение применимо лишь к ссылочным типам, так как развернутые сущности по природе не могут быть полиморфными.
В наших примерах лыжник s и многоугольник p - полиморфны по правилу (1). Первому из них присваивается объект BOY b, второму - объект RECTANGLE r.
Если вы познакомились с формулировкой понятия набора типов, то заметили, насколько пессимистичнее выглядит определение полиморфной сущности, и насколько проще его проверить. Не пытаясь отыскать все всевозможные динамические типы сущности, мы довольствуемся общим вопросом: может данная сущность быть полиморфной или нет? Наиболее удивительным выглядит правило (3), по которому полиморфным считается каждый формальный параметр (если его тип не расширен, как в случае с целыми и т. д.). Мы даже не утруждаем себя анализом вызовов. Если у подпрограммы есть аргумент, то он находится в полном распоряжении клиента, а значит, и полагаться на указанный в объявлении тип нельзя. Это правило тесно связано с повторным использованием - целью объектной технологии, - где любой класс потенциально может быть включен в состав библиотеки, и будет многократно вызываться различными клиентами.
Характерным свойством этого правила является то, что оно не требует никаких глобальных проверок. Для выявления полиморфности сущности достаточно просмотреть текст самого класса. Если для всех запросов (атрибутов или функций) сохранять информацию об их статусе полиморфности, то не приходится изучать даже тексты предков. В отличие от отыскания наборов типов, можно обнаружить полиморфные сущности, проверяя класс за классом в процессе возрастающей компиляции.
Как было сказано при обсуждении наследования, подобный анализ может также представлять ценность при оптимизации кода.Вызовы, как и сущности, могут быть полиморфными:
Определение: полиморфный вызов
Вызов является полиморфным, если его цель полиморфна.
Оба вызова в наших примерах полиморфны: s.share (g) ввиду полиморфизма s, p.add_ vertex (...) ввиду полиморфизма p. Согласно определению, только квалифицированные вызовы могут быть полиморфны. (Придав неквалифицированному вызову f (...) вид квалифицированного Current.f (...), мы не меняем суть дела, поскольку Current, присвоить которому ничего нельзя, не является полиморфным объектом.)
Далее нам потребуется понятие Кэтколла, основанное на понятии CAT. (CAT - это аббревиатура Changing Availability or Type - изменение доступности или типа). Подпрограмма является CAT подпрограммой, если некоторое ее переопределение потомком приводит к изменениям одного из двух видов, которые, как мы видели, являются потенциально опасными: изменяет тип аргумента (ковариантно) или скрывает ранее экспортировавшийся компонент.
Определение: CAT-подпрограммы
Подпрограмма называется CAT-подпрограммой, если некоторое ее переопределение изменяет статус экспорта или тип любого из ее аргументов.
Это свойство опять-таки допускает возрастающую проверку: любое переопределение типа аргумента или статуса экспорта делают процедуру или функцию CAT-подпрограммой. Отсюда следует понятие Кэтколла: вызова CAT-подпрограммы, который может оказаться ошибочным.
Определение: Кэтколл
Вызов называется Кэтколлом, если некоторое переопределение подпрограммы сделало бы его ошибочным из-за изменения статуса экспорта или типа аргумента.
Созданная нами классификация позволяет выделять специальные группы вызовов: полиморфные и кэтколлы. Полиморфные вызовы придают выразительную мощь объектному подходу, кэтколлы позволяют переопределять типы и ограничивать экспорт. Используя терминологию, введенную ранее в этой лекции, можно сказать, что полиморфные вызовы расширяют полезность (usefulness), кэтколлы - используемость(usability).
Вызовы share и add_vertex, рассмотренные в наших примерах, являются кэт-коллами. Первый осуществляет ковариантное переопределение своего аргумента. Второй экспортируется классом RECTANGLE, но скрыт классом POLYGON. Оба вызова также и полиморфны, а потому они служат прекрасным примером полиморфных кэтколлов. Они являются ошибочными согласно правилу типов Кэтколл.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Список определений
Список определений Бывает, что на сайте нужно создать список терминов или словарь. Это особенно актуально для сайтов узкой направленности. Для создания подобных конструкций служит список определений.Список определений – это особый вид списка, который применяется для
Как «продать» одно и то же содержание десять раз?
Как «продать» одно и то же содержание десять раз? Метки: темы блога, вирусное распространение, видео, конкурсКогда вы пишете пост в блог, публикуете картинку или видео, размещаете подкаст, подумайте, нельзя ли использовать тот же контент еще раз или даже несколько раз. В
19.6.8 Список определений
19.6.8 Список определений Список определений является последовательностью терминов и их определений: <DL><LH>Терминология WWW</LH><DТ>Язык разметки гипертекста (HTML)<DD>Язык форматирования для записи гипертекстовых документов. Теги документаидентифицируют такие
14.1. Обновление определений
14.1. Обновление определений Защитник Windows в своей работе использует специальную таблицу определений, которая содержит описание кусков кода всех существующих вирусов, троянов и других подобных программ. И если эта таблица не будет содержать актуальных данных, программа
10.10. Несколько производителей, несколько потребителей
10.10. Несколько производителей, несколько потребителей Следующее изменение, которое мы внесем в нашу пpoгрaммy, будет заключаться в добавлении возможности одновременной работы нескольких потребителей вместе с несколькими производителями. Есть ли смысл в наличии
22. Минимизируйте зависимости определений и избегайте циклических зависимостей
22. Минимизируйте зависимости определений и избегайте циклических зависимостей РезюмеИзбегайте излишних зависимостей. Не включайте при помощи директивы #include определения там, где достаточно предварительного объявления.Избегайте взаимозависимостей. Циклические
11.3.7. Удаление определений
11.3.7. Удаление определений Вследствие динамичности Ruby практически все, что можно определить, можно и уничтожить. Это может пригодиться, например, для того, чтобы «развязать» два куска кода в одной и той же области действия, избавляясь от переменных после того, как они были
Окно определений программного кода
Окно определений программного кода Если вы имеете опыт программирования в .NET 1.1, то должны знать об утилите Windows Forms Class Viewer, wincv.exe (утилита обзора классов Windows Forms). Этот инструмент позволяет задать имя .NET-типа и просмотреть его C#-определение. В версии .NET 2.0 утилиты wincv.exe уже
Игра в очко, или двадцать одно
Игра в очко, или двадцать одно Исходный файл: Blackjack.fla Двадцать одно – еще одна популярная карточная игра в казино, которую легко можно перенести на компьютер. Раздающий карты следуют определенному набору правил, следовательно, можно написать программу, которая будет
14.5.6. Одно замечание по поводу программы-оболочки
14.5.6. Одно замечание по поводу программы-оболочки В некоторых местах нашей программы-оболочки обнаруживается недостаток той "декларативной ясности", которая так характерна для программ, написанных на Прологе. Причина состоит в том, что нам пришлось предусмотреть в этой
ТЕХНОЛОГИИ: В одно касание
ТЕХНОЛОГИИ: В одно касание Автор: Родион НасакинКогда речь заходит об ИТ-решениях в сфере безопасности платежей, на ум сразу же приходят защищенные каналы передачи данных, генераторы одноразовых паролей, разнообразные токены и т. п. Наряду с этим биометрические
Одно- и двусвязные элементы
Одно- и двусвязные элементы В следующем примере мы обратимся к базовым структурам данных. Рассмотрим библиотечный класс LINKABLE, описывающий односвязные элементы, используемые в LINKED_LIST - одной из реализаций списков. Вот частичное описание класса:indexingdescription: "Односвязные
Подход третий: Несколько product owner’ов - несколько backlog’ов
Подход третий: Несколько product owner’ов - несколько backlog’ов Похоже на второй вариант, по отдельному product backlog на команду, только ещё и с отдельным product owner’ом на каждую команду. Мы не пробовали так делать, и, скорее всего, пробовать не будем.Если два product backlog’а касаются одного и
Moto X Skip: разблокировка смартфона в одно касание Николай Маслухин
Moto X Skip: разблокировка смартфона в одно касание Николай Маслухин Опубликовано 19 августа 2013 Средний пользователь смартфона производит процедуру разблокировки от 40 до 100 раз в день. Это может быть довольно обременительным, даже если телефон не