Атрибуты, перобъявленные как INVERSE.
Явные атрибуты, переобъявляемые как DERIVE.
Внешнее отображение.
Внутренее отображение
Если используется внутренее отображение, экземпляр объекта должен быть отображен в SIMPLE_ENTITY_INSTANCE (см. табл. 3). Ключевое слово KEYWORD должно быть именем конечного типа данных объекта, как указано в 7.2.11. Список параметров (PARAMETER_LIST) должен содержать значения унаследованных явных атрибутов всех объектов супертипа и явных атрибутов конечного типа данных объекта.
Пример простого отношения подтип/супертип. Определение объекта в EXPRESS/
ENTITY aa ABSTRACT SUBTYPE OF (ONEOF(bb,cc);
Attr_a: zz;
END_ENTITY;
ENTYTI bb SUBTYPE OF(aa);
ABSTRACT SUPERTYPE OF (ONEOF(xx));
Attr_b1: xx;
Attr_b2: yy;
END_ENTYTI;
ENTITY cc SYBTYPE OF (aa);
Attr_c:REAL;
END_ENTITY;
ENTITY xx SYBTYPE OF (bb);
Attr_x:REAL;
END_ENTITY;
ENTITY zz;
Attr_z:STRING;
END_ENTITY;
ENTITY yy;
Attr_1:REAL;
Attr_2:REAL;
Attr_3:REAL;
END_ENTITY;
Образец экземпляра объекта типа данных объекта хх в секции данных.
#1 = ZZ(‘ZATTR’);
#2 = YY(1.0,2.0,3.);
#3 = YY(2.0,2.0,0.0);
#4 = XX(#1,#2,#3,#4);
Если используется внешнее отображение, экземпляр объекта должен быть отображен в COMPLEX_ENTITY_INSTANCE (см. табл.3).
|
|
Пример отображения подтипов, связанных посредством ANDOR. определение объекта в EXPRESS/
ENTITY aa SUPERTYPE OF (bb ANDOR cc);
Attr_a:STRING;
END_ENTITY;
ENTYTI bb SUBTYPE OF(aa);
Attr_b:INTEGER;
END_ENTYTI;
ENTITY cc SYBTYPE OF (aa);
Attr_c:REAL;
END_ENTITY;
ENTITY dd;
Attr_d:aa;
END_ENTITY;
Образец экземпляра объекта типа данных объекта хх в секции данных.
#1 = ВВ(‘simple string’, 15);
#2 = CC(‘S’,3.0);
#3 = (AA(‘ASTRID’)BB(17)CC(4.0));
#4 = DD(#1);
#5 = DD(#2);
#6 = DD(#3);
#7 = AA(‘ABC’);
Если объект подтипа переобъявляет атрибут своего супертипа с помощью раздела DERIVE, а исходный атрибут является явным атрибутом, то значение исходного атрибута в супертипе должно кодироваться звездочкой (*).
Пример.
ENTITY point;
x:REAL;
y:REAL;
z:REAL;
END_ENTITY;
ENTITY point_on_curve SUBTYPE OF (point);
u:REAL;
c:curve;
DERIVE
SELF\point.x:real:=fx(u,c);
SELF\point.y:real:=fx(u,c);
SELF\point.z:real:=fx(u,c);
END_ENTITY;
ENTITY curve;
Attr:STRING;
END_ENTITY;
Образец экземпляра в секции данных.
#1 = CURVE(‘curve_attribute’);
#2 = POINT_ON_CURVE(*,*,*,0.55,#1);
#3 = POINT(2.0,3.0,4.0);
Если объект подтипа переобъявляет атрибут своего супертипа с помощью INVERSE, это не влияет на кодирование. Переобъявленный атрибут в любом случае не кодируется.
Если объект подтипа переобъявляет атрибут одного из своих супертипов как явный атрибут, т.е. не с помощью INVERSE или DERIVE, это не влияет на кодирование.
Значение атрибута должно быть закодировано как атрибут супертипа, как определено в 3.2.5, с применением отображения, определенного в разделе 3 для типа данных атрибута в супертипе. Переобявленный атрибут должен игнорироваться, т.е. это не должно рассматриваться атрибутом подтипа для целей кодирования.
Пример.
ENTITY aaa SUPERTIPE OF (ONEOF (bbb, ccc));
|
|
a1:NUMBER;
a2:curve;
INVERSE
a3:SET OF mmm FOR m1;
END_ENTITY;
ENTITY bbb SUBTYPE OF (aaa);
SELF\aaa.a1:INTEGER;
b =:REAL;
END_ENTITY;
ENTITY ccc SUBTYPE OF (aaa);
SELF\aaa.a2:line;
INVERSE
SELF\aaa.a3:SET [1:2] OF mmm FOR m1;
END_ENTITY;
ENTITY curve;
...
END_ENTITY;
ENTITY mmm;
m1:aaa;
END_ENTITY;
Образцы экземпляров в секции данных.
#1 = LINE(...);
#2 = CURVE(...);
#3 = BBB(1.0,#2,0.5);
#4 = CCC(1.5,#1);