Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Следующая версия Следующая версия справа и слева | ||
bb:redbook:211 [2018/11/30 01:13] 127.0.0.1 внешнее изменение |
bb:redbook:211 [2019/07/24 14:57] caufman [5. Атрибут EXTENSIBLE] |
||
---|---|---|---|
Строка 14: | Строка 14: | ||
Пример ниже демонстрирует некоторые возможности абстрактных методов: | Пример ниже демонстрирует некоторые возможности абстрактных методов: | ||
- | + | MODULE Test_abs_method; | |
- | + | ||
- | + | | |
+ | |||
+ | TYPE | ||
+ | tVector = POINTER TO ABSTRACT RECORD | ||
+ | x*: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector = POINTER TO RECORD (tVector) | ||
+ | z*: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector1 = POINTER TO RECORD (tVector) | ||
+ | z*: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tMyVector; | ||
+ | v1: tMyVector1; | ||
+ | |||
+ | PROCEDURE (v: tVector)Log*, | ||
+ | |||
+ | PROCEDURE (v: tMyVector)Log*(); | ||
+ | BEGIN | ||
+ | Log.Real(v.z); | ||
+ | END Log; | ||
+ | |||
+ | PROCEDURE (v: tMyVector1)Log*(); | ||
+ | BEGIN | ||
+ | Log.String(" | ||
+ | Log.Real(v.z); | ||
+ | Log.String(" | ||
+ | END Log; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | BEGIN | ||
+ | v.Log; | ||
+ | v1.Log | ||
+ | END Start; | ||
+ | |||
+ | BEGIN | ||
+ | NEW (v); | ||
+ | NEW (v1); | ||
+ | END Test_abs_method. | ||
+ | |||
+ | (!)Test_abs_method.Start | ||
+ | |||
+ | компилируется " | ||
+ | старый модуль Test_abs_method выгружен | ||
+ | 0.0 0.0 | ||
+ | Привет, | ||
+ | 0.0 0.0 | ||
+ | ------------- | ||
Как видно из примера, | Как видно из примера, | ||
Строка 30: | Строка 81: | ||
==== 5. Атрибут EXTENSIBLE ==== | ==== 5. Атрибут EXTENSIBLE ==== | ||
Атрибут EXTENSIBLE для методов, | Атрибут EXTENSIBLE для методов, | ||
- | + | MODULE Test_ext_method; | |
- | + | ||
+ | IMPORT Log; | ||
+ | |||
+ | TYPE | ||
+ | tVector = POINTER TO ABSTRACT RECORD | ||
+ | x*: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector = POINTER TO EXTENSIBLE RECORD (tVector) | ||
+ | y*: REAL; | ||
+ | END; | ||
+ | |||
+ | tMyVector1 = POINTER TO RECORD (tMyVector) | ||
+ | z*: REAL; | ||
+ | END; | ||
+ | |||
+ | VAR | ||
+ | v: tMyVector; | ||
+ | v1: tMyVector1; | ||
+ | |||
+ | PROCEDURE (v: tVector)Log*, | ||
+ | |||
+ | PROCEDURE (v: tMyVector)Log*(), | ||
+ | BEGIN | ||
+ | Log.Real(v.x); | ||
+ | END Log; | ||
+ | |||
+ | PROCEDURE (v: tMyVector1)Log*(); | ||
+ | BEGIN | ||
+ | Log.String(" | ||
+ | Log.Real(v.x); | ||
+ | Log.String(" | ||
+ | END Log; | ||
+ | |||
+ | PROCEDURE Start*; | ||
+ | BEGIN | ||
+ | v.Log; | ||
+ | v1.Log | ||
+ | END Start; | ||
+ | |||
+ | BEGIN | ||
+ | NEW (v); | ||
+ | NEW (v1); | ||
+ | END Test_ext_method. | ||
+ | |||
+ | (!)Test_ext_method.Start | ||
+ | |||
+ | компилируется " | ||
+ | старый модуль Test_ext_method выгружен | ||
+ | 0.0 0.0 | ||
+ | Привет, | ||
+ | 0.0 0.0 0.0 | ||
+ | ------------- | ||
В модуле определено три типа: tpVector, tpMyVector и tpMyVector1. Причём, | В модуле определено три типа: tpVector, tpMyVector и tpMyVector1. Причём, | ||