Инструменты пользователя

Инструменты сайта


bb:redbook:211

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия Следующая версия справа и слева
bb:redbook:211 [2019/07/24 14:53]
caufman [3. Атрибут ABSTRACT]
bb:redbook:211 [2019/07/24 14:57]
caufman [5. Атрибут EXTENSIBLE]
Строка 81: Строка 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*, NEW, ABSTRACT; 
 +   
 +  PROCEDURE (v: tMyVector)Log*(), EXTENSIBLE; 
 +  BEGIN 
 +      Log.Real(v.x); Log.Real(v.y); Log.Ln 
 +  END Log; 
 +   
 +  PROCEDURE (v: tMyVector1)Log*(); 
 +  BEGIN 
 +      Log.String("Привет, мир!"); Log.Ln; 
 +      Log.Real(v.x);Log.Real(v.y); Log.Real(v.z); Log.Ln; 
 +      Log.String("-------------"); Log.Ln; 
 +  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"   248   8 
 +  старый модуль Test_ext_method выгружен 
 +   0.0 0.0 
 +  Привет, мир! 
 +   0.0 0.0 0.0 
 +  -------------
 В модуле определено три типа: tpVector, tpMyVector и tpMyVector1. Причём, все они являются друг другу базовыми. В каждом типе добавляется по одному полю, и переопределяется метод Log (кроме, разумеется самого "древнего" типа, который полностью абстрактный — tpVector). В первом типе метод Log — абстрактный, с ним вообще нельзя работать. Во втором случае — уже работает, и его можно переопределять. А в третьем случае, метод не помечен как EXTENSIBLE, а это значит, что если вдруг возникнет необходимость, например, в типе tpMyVector2 изменить этот метод — ничего не выйдет. Компилятор такое действие запретит.  [↑] В модуле определено три типа: tpVector, tpMyVector и tpMyVector1. Причём, все они являются друг другу базовыми. В каждом типе добавляется по одному полю, и переопределяется метод Log (кроме, разумеется самого "древнего" типа, который полностью абстрактный — tpVector). В первом типе метод Log — абстрактный, с ним вообще нельзя работать. Во втором случае — уже работает, и его можно переопределять. А в третьем случае, метод не помечен как EXTENSIBLE, а это значит, что если вдруг возникнет необходимость, например, в типе tpMyVector2 изменить этот метод — ничего не выйдет. Компилятор такое действие запретит.  [↑]
   
bb/redbook/211.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)