Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций по дисциплине Объектно-ориентирован...doc
Скачиваний:
33
Добавлен:
01.07.2025
Размер:
14 Мб
Скачать
☆

8. Перечислимые типы

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

Перечислимые типы относятся к целым порядковым типам и к ним применимы любые операции сравнения (>, < и т.п.), а также процедуры и функции, определенные для порядковых типов.

Если возможные значения типа определены, как указано выше, в переменной при ее объявлении, то нельзя будет ввести другую переменную с теми же значениями. Если такая потребность имеется, то перечислимый тип надо определять именно как тип:

type <имя типа> = (<значение!>/ .../ Оначение п>);

Тогда можно ввести в программе несколько переменных этого типа. Например:

type TMode =: (mRead, mEdit, mWrite); var Model, Mode2 : TMode;

9. Ограниченные типы

Для порядковых типов можно задать поддиапазон их возможных значений для вводимого вами типа или переменной — это и будет ограниченный тип. Задается диапазон значений ограниченного типа выражением вида

<минимальное значение>..<максимальное значение>

Например:

var Letter : ' а'..'z' ;

Mum : 1. .12;

type Caps = 'A1..'Z1;

Ограниченные типы используются, например, при объявлениях размеров массивов. Но они могут использоваться и самостоятельно. В компиляторе Object Pascal имеется опция, позволяющая включить проверку диапазона при присваивании значения переменной ограниченного типа. Вы можете ее включить в том месте вашей программы, где хотите начать проверку диапазона, и выключить проверку, где захотите, опцией {$R-}. Можно также включить опцию проверки в окне Project Options на странице Compiler (см. раздел 12.2.2). Это надежнее, так как опция {$R+} срабатывает только при ошибках диапазона, очевидных для компилятора, а установка опции проверки диапазона в окне Project Options действует в процессе выполнения (в режиме отладки) и при попытке присвоить переменной ограниченного типа значение, выходящее за пределы заданного поддиапазона, генерирует исключение с сообщением «Range check error».

При использовании в объявлении ограниченного типа константных выражений возможны некоторые ошибки компилятора. Например, объявления

const Х=100;

Y=200;

type Scale = (X+Y) div 2..Y;

вызовут сообщение компилятора об ошибке, поскольку, если после знака равенства в объявлении типа следует скобка, то компилятор считает, что описывается перечислимый тип. Чтобы избежать такой ошибки, приведенные выше объявления можно заменить следующими:

const Х=100;

Y=200;

type Scale = 1*(X+Y) div 2..Y;

10. Множества

Множество — это группа элементов, которая ассоциируется с ее именем и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Один и тот же элемент не может входить в множество более одного раза. Как частный случай, множество может быть пустым.

Множество определяется перечислением его элементов, заключенным в прямоугольные скобки. Такая форма определения называется конструктором множества. Например, если множество возможных единичных символов, которые могут быть получены в ответ на вопрос программы «Yes/No», содержит символы «у», «Y», «п» и «N», то это множество можно описать таким конструктором:

['у','Y','n','N']

Для определения, принадлежит ли переменная множеству, служит операция in. В предыдущем примере проверить, дал ли пользователь один из допустимых ответов, можно оператором:

if (Key in ['у1,'Y1,'n1,'N'])

then <оператор, выполняемый при допустимом ответе>

Множества могут содержать не только отдельные значения, но и ограниченные типы.

Объявление типа множества делается в форме

set of <базовый тип>

11. Тип variant

Object Pascal является строго типизированным языком. Но в нем имеется тип variant, отступающий от этого правила. В переменных типа variant могут храниться данные любых типов, кроме записей, множеств, статических массивов, файлов, классов, ссылок на классы, указателей и Int64. Иначе говоря, переменные типа variant могут хранить все, кроме структур, указателей и Int64. Они могут также хранить объекты СОМ и CORBA, обеспечивая доступ к их методам и свойствам. Могут они также хранить динамические массивы и специальные массивы variant, о которых будет рассказано ниже.

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

Переменные типа variant занимают 16 битов и содержат код типа и значение переменной или указатель на это значение. В момент создания эти переменные инициализируются специальным значением Unassigned. Значение переменной null свидетельствует о неизвестном или ошибочном значении переменной.

Переменные типа variant могут использоваться в выражениях как операнды любых операций, кроме ", is и in, совместно с другими величинами типов variant, integer, real, string, Boolean. Компилятор в этих случаях автоматически осуществляет приведение типов величин в выражении. Если оба операнда операции имеют тип variant и один или оба операнда равны null, то результат операции тоже равен null. Если один или оба операнда имеют значение Unassigned, то генерируется исключение. Если в бинарной операции только один из операндов имеет тип variant, то другой тоже преобразуется в тип variant.

Контрольные вопросы:

  1. Какие функции используются в порядковых типах данных?

  2. Какая стандартная функция используются в сроковом типе?

  3. Где используются ограниченные типы данных?

  4. Приведите пример описания типа множества.

  5. С какими данными опрериует тип variant?

Рекомендуемая литература: 1.1, 1.3, 1.5, 1.6, 1.7, 1.8.