Справочное руководство по языку Ада-83


Ссылочные типы - часть 3


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

Раздел дискриминантов должен быть дан в полном описании типа тогда и только тогда, когда он дан в неполном описании типа; если разделы дискриминантов даны, то они должны быть согласованы (см. 6.3.1 для правил согласования). До конца полного описания типа использование имени, обозначающего" тип, объявленный неполным описанием типа, допустимо только как обозначение типа в указании подтипа определения ссылочного типа; единственной формой ограничения, допустимой в указании подтипа, являются ограничения дискриминанта.

Предвыполнение неполного описания типа создает тип. Если неполное описание типа имеет раздел дискриминантов, то это Предвыполнение включает Предвыполнение раздела дискриминантов: в этом случае раздел дискриминантов полного описания типа не предвыпол-няется.

11 явно или неявно, прямо или косвенно. —

Прим. ред.

Пример рекурсивного типа:

type CELL; — неполное описание типа type LINK is access CELL;

type CELL is record

VALUE : INTEGER; SUCC : LINK; PRED : LINK; end record;

HEAD : LINK := new CELL'(O, null, null); NEXT : LINK := HEAD.SUCC;

Примеры взаимозависимых ссылочных типов:

type PERSON(SEX : GENOER); — неполное описание типа type CAR; — неполное описание типа

type PERSONNAME is access PERSON; type CARNAME is access CAR;

type CAR is record

NUMBER : INTEGER; OWNER : PERSONNAME; end record;

type PERSON(SEX : GENDER) is

record

NAME : STRING(1 .. 20); BIRTH : DATE; AGE : INTEGER range 0 .. 130; VEHICLE : CAR_NAME; casa SEX is

when M => WIFE : PERSON_NAME(SEX => F); when F => HUSBAND ; PERSON_NAME(SEX => M); end case:




Начало  Назад  Вперед