Библиотека программиста

«Очень важно не прерывать вопросов. Любопытство имеет свое право на существование»

Альберт Эйнштейн

Главная страница > Язык Object Pascal > 10. Записи

10. Записи

Запись – это множество разнотипных элементов. Каждый элемент (поле) записи имеет свое собственное имя и тип. Синтаксис записей тот же, что и ВР.

Вариантные части записи.

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

type

recordTypeName = record

fieldList 1 : type 1 ;

. . .

fieldList n : type n ;

case tag: ordinalType of

constantList 1 : (variant 1 );

. . .

constantList n : (variant n );

end;

В вариантной части:

селектор tag – не обязателен и может быть любым допустимым идентификатором. Если он опущен, то необходимо опустить и двоеточие после него;

ordinalType – идентификатор любого порядкового типа;

каждый constantList должен быть константой, списком разделенных запятыми констант или диапазоном. Тип констант должен быть порядковым; и никакая константа не может повторяться;

каждый variant является списком полей, разделенных запятыми, после которого должен следовать, через двоеточие, идентификатор типа полей. Список полей может состоять и из одного элемента.

Любой variant имеет следующий формат:

fieldList 1 : type 1 ;

. . .

fieldList n : type n ;

Здесь каждый fieldList – идентификатор или список идентификаторов, разделенных запятыми. Как и для «обычных» полей, тип type не должен быть:

long strings;

dynamic arrays;

variants (т.е. типом Variant);

интерфейсом interface;

никаким структурным типом, содержащим в качестве полей любой из перечисленных типов.

Вместе с тем, fieldList может содержать указатели на эти типы.

Идентификатор tag, если он есть, интерпретируется как обычное (дополнительное) поле в невариантной части записи.

Вариантные записи предназначены для достижения двух основных целей:

создания записи с полями разных типов, к которым не предполагается одновременный доступ;

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

Первый пример:

type

TEmployee = record

FirstName, LastName: string[40];

BirthDate: TDate;

case Salaried: Boolean of

True: (AnnualSalary: Currency);

False: (HourlyWage: Currency);

end;

Идея такой записи в том, что любой служащий может иметь только один из двух видов оплат:годовой оклад (AnnualSalary) или почасовую оплату (HourlyWage).

Второй пример:

type

TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other);

TFigure = record

case TShapeList of

Rectangle: (Height, Width: Real);

Triangle: (Side1, Side2, Angle: Real);

Circle: (Radius: Real);

Ellipse, Other: ();

end;





<< Предыдущая статья
«9. Массивы»
Следующая статья >>
11. Файловые типы