Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
| 
                    bb:redbook:211 [2016/04/05 12:24] prospero78 [1. Понятие о атрибутах методов]  | 
                
                    bb:redbook:211 [2020/10/29 07:08] (текущий) | 
            ||
|---|---|---|---|
| Строка 2: | Строка 2: | ||
| ==== 1. Понятие о атрибутах методов ==== | ==== 1. Понятие о атрибутах методов ==== | ||
| - | Атрибуты методов, | + | Атрибуты методов, | 
| ==== 2. Атрибут NEW ==== | ==== 2. Атрибут NEW ==== | ||
| Строка 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. Причём, | ||
| Строка 39: | Строка 142: | ||
| Пример использования супер-вызова приведён ниже: | Пример использования супер-вызова приведён ниже: | ||
| - | + |   MODULE Test_super_method; | |
| + | |||
| + | IMPORT Log; | ||
| + | |||
| + | TYPE | ||
| + | tVector = POINTER TO EXTENSIBLE RECORD | ||
| + | x*: REAL; | ||
| + | END; | ||
| + | |||
| + | tMyVector = POINTER TO RECORD (tVector) | ||
| + | y*: REAL; | ||
| + | END; | ||
| + | |||
| + | |||
| + | VAR | ||
| + | v: tVector; | ||
| + |       v1: tMyVector; | ||
| + | |||
| + |   PROCEDURE (v: tVector)Log*(), | ||
| + | BEGIN | ||
| + |       Log.Real(v.x); | ||
| + | END Log; | ||
| + | |||
| + |   PROCEDURE (v: tMyVector)Log*(); | ||
| + | BEGIN | ||
| + |       Log.String(" | ||
| + |       Log.Real(v.y); | ||
| + |       Log.String(" | ||
| + | END Log; | ||
| + | |||
| + | PROCEDURE Start*; | ||
| + | BEGIN | ||
| + | v.Log; | ||
| + | v1.Log | ||
| + | END Start; | ||
| + | |||
| + | BEGIN | ||
| + | NEW (v); | ||
| + | NEW (v1); | ||
| + | END Test_super_method. | ||
| + | |||
| + | (!)Test_super_method.Start | ||
| + | |||
| + |   компилируется " | ||
| + | старый модуль Test_super_method выгружен | ||
| + | 0.0 | ||
| + |   Привет, | ||
| + | 0.0 0.0 | ||
| + | ------------- | ||
| В примере хорошо видно, что супер-вызов оформлен в виде инструкции v.Log^. Вместо того, чтобы заново переписывать всю логику в методе, | В примере хорошо видно, что супер-вызов оформлен в виде инструкции v.Log^. Вместо того, чтобы заново переписывать всю логику в методе, | ||