Показаны различия между двумя версиями страницы.
bb:redbook:211 [2019/07/24 14:58] caufman [6. Супер-вызов] |
bb:redbook:211 [2020/10/29 07:08] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ===== 2.11 Введение в атрибуты методов ===== | ||
- | ==== 1. Понятие о атрибутах методов ==== | ||
- | Атрибуты методов, | ||
- | |||
- | ==== 2. Атрибут NEW ==== | ||
- | C атрибутом NEW у методов уже приходилось встречаться несколько раз ранее. Как и ключевое слово NEW при создании переменных указательной природы, | ||
- | |||
- | Пример использования ключевого слова NEW не приводится, | ||
- | |||
- | |||
- | ==== 3. Атрибут ABSTRACT ==== | ||
- | Как и в атрибутах типов, в атрибутах методов ABSTRACT указывает на то, что данный метод нельзя вызвать непосредственно. Его необходимо реализовать в типе-потомке. Кроме того, абстрактный метод должен быть в составе абстрактного типа (который тоже нельзя использовать непосредственно). Если есть необходимость переопределения метода в типе-потомке как абстрактного, | ||
- | |||
- | Пример ниже демонстрирует некоторые возможности абстрактных методов: | ||
- | MODULE Test_abs_method; | ||
- | | ||
- | IMPORT Log; | ||
- | | ||
- | 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 | ||
- | ------------- | ||
- | Как видно из примера, | ||
- | |||
- | |||
- | ==== 4. Атрибут EMPTY ==== | ||
- | Этот атрибут подобен атрибуту ABSTRACT. Ключевое слово EMPTY дописывается в одну строку после объявления процедуры: | ||
- | |||
- | PROCEDURE (v: tpVector)Log*, | ||
- | |||
- | Отличие EMPTY(" | ||
- | |||
- | |||
- | ==== 5. Атрибут 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. Причём, | ||
- | |||
- | |||
- | ==== 6. Супер-вызов ==== | ||
- | Ничего страшного в понятии супер-вызов нет. Супермены к нему никакого отношения не имеют. Речь идёт о вызове из типа-потомка метода, | ||
- | |||
- | Пример использования супер-вызова приведён ниже: | ||
- | 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^. Вместо того, чтобы заново переписывать всю логику в методе, | ||
- | |||
- | |||
- | ==== 7. Выводы ==== | ||
- | В этой главе были рассмотрены атрибуты методов для реализации ООП в Компонентном Паскале. Вместе с предыдущими главами, | ||
- | |||
- | [ ← Назад | ||
- |