Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
bb:redbook:210 [2019/07/24 10:10] caufman [3. Расширяемые типы] |
bb:redbook:210 [2019/07/24 10:33] caufman [5. Указательные типы] |
||
---|---|---|---|
Строка 75: | Строка 75: | ||
Пример приводится ниже: | Пример приводится ниже: | ||
- | + | MODULE Test_limited; | |
- | + | ||
- | + | | |
+ | tVector = LIMITED RECORD | ||
+ | x: REAL; | ||
+ | y: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector1 = RECORD (tVector) | ||
+ | z: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tVector; | ||
+ | v1: tMyVector1; | ||
+ | |||
+ | BEGIN | ||
+ | END Test_limited. | ||
Как видно в примере, | Как видно в примере, | ||
Исправленный пример ниже: | Исправленный пример ниже: | ||
- | + | MODULE Test_limited; | |
- | + | ||
+ | TYPE | ||
+ | tVector = LIMITED RECORD | ||
+ | x: REAL; | ||
+ | y: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector1 = LIMITED RECORD (tVector) | ||
+ | z: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tVector; | ||
+ | v1: tMyVector1; | ||
+ | |||
+ | BEGIN | ||
+ | END Test_limited. | ||
И как видно, никаких вопросов у компилятора к программисту не возникает. [↑] | И как видно, никаких вопросов у компилятора к программисту не возникает. [↑] | ||
Строка 95: | Строка 126: | ||
Примеры работы с записевыми типами не сильно отличаются от простых типов: | Примеры работы с записевыми типами не сильно отличаются от простых типов: | ||
- | + | MODULE Test_pointer; | |
- | + | ||
+ | IMPORT Log; | ||
+ | |||
+ | TYPE | ||
+ | tVector = ABSTRACT RECORD | ||
+ | x: REAL; | ||
+ | y: REAL; | ||
+ | END; | ||
+ | |||
+ | tPVector = POINTER TO RECORD (tVector) | ||
+ | z: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tPVector; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | BEGIN | ||
+ | Log.Real(v.x); | ||
+ | Log.Ln | ||
+ | END Start; | ||
+ | |||
+ | BEGIN | ||
+ | NEW (v); | ||
+ | END Test_pointer. | ||
+ | |||
+ | (!)Test_pointer.Start | ||
+ | |||
+ | компилируется " | ||
+ | старый модуль Test_pointer выгружен | ||
+ | 0.0 0.0 0.0 | ||
В результате выполнения указанного фрагмента будут созданы базовый абстрактный тип tVector, который нельзя реализовать непосредственно. На его базе создаётся указательный тип tpVector, который вполне себе реализуем. При начале работе модуля через NEW создаётся экземпляр указательного типа tpVector, а в экспортируемой процедуре Start выводится значение всех полей. Как видно из вывода, | В результате выполнения указанного фрагмента будут созданы базовый абстрактный тип tVector, который нельзя реализовать непосредственно. На его базе создаётся указательный тип tpVector, который вполне себе реализуем. При начале работе модуля через NEW создаётся экземпляр указательного типа tpVector, а в экспортируемой процедуре Start выводится значение всех полей. Как видно из вывода, | ||
Также следует отметить, | Также следует отметить, | ||
- | + | MODULE Test_pointer; | |
- | + | ||
+ | IMPORT Log; | ||
+ | |||
+ | TYPE | ||
+ | tPVector = POINTER TO RECORD | ||
+ | z: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tPVector; | ||
+ | |||
+ | PROCEDURE (v: tPVector)Log(), | ||
+ | BEGIN | ||
+ | Log.Real(v.z); | ||
+ | END Log; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | BEGIN | ||
+ | v.Log | ||
+ | END Start; | ||
+ | |||
+ | BEGIN | ||
+ | NEW (v); | ||
+ | END Test_pointer. | ||
+ | |||
+ | (!)Test_pointer.Start | ||
+ | |||
+ | компилируется " | ||
+ | старый модуль Test_pointer выгружен | ||
+ | 0.0 | ||
Как видно из примера, | Как видно из примера, | ||