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

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


bb:redbook:210

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
bb:redbook:210 [2019/07/24 10:20]
caufman [4. Ограниченные типы]
bb:redbook:210 [2019/07/24 10:33] (текущий)
caufman [5. Указательные типы]
Строка 126: Строка 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.Real(v.y);​Log.Real(v.z);​ 
 +      Log.Ln 
 +  END Start; 
 +   
 +  BEGIN 
 +      NEW (v); 
 +  END Test_pointer. 
 + 
 +  (!)Test_pointer.Start 
 +   
 +  компилируется "​Test_pointer" ​  ​112 ​  4 
 +  старый модуль Test_pointer выгружен 
 +  0.0 0.0 0.0
 В результате выполнения указанного фрагмента будут созданы базовый абстрактный тип tVector, который нельзя реализовать непосредственно. На его базе создаётся указательный тип tpVector, который вполне себе реализуем. При начале работе модуля через NEW создаётся экземпляр указательного типа tpVector, а в экспортируемой процедуре Start выводится значение всех полей. Как видно из вывода,​ все поля честно установлены в 0.0. В результате выполнения указанного фрагмента будут созданы базовый абстрактный тип tVector, который нельзя реализовать непосредственно. На его базе создаётся указательный тип tpVector, который вполне себе реализуем. При начале работе модуля через NEW создаётся экземпляр указательного типа tpVector, а в экспортируемой процедуре Start выводится значение всех полей. Как видно из вывода,​ все поля честно установлены в 0.0.
  
 Также следует отметить,​ что привязка методов к указательному типу выполняется несколько иначе, чем записевму типу: Также следует отметить,​ что привязка методов к указательному типу выполняется несколько иначе, чем записевму типу:
-  +  MODULE Test_pointer;​ 
- +   
 +  IMPORT Log; 
 +   
 +  TYPE 
 +      tPVector = POINTER TO RECORD 
 +          z: REAL; 
 +      END; 
 +   
 +  VAR 
 +      v: tPVector; 
 +   
 +  PROCEDURE (v: tPVector)Log(),​ NEW; 
 +  BEGIN 
 +      Log.Real(v.z);​ Log.Ln 
 +  END Log; 
 +   
 +  PROCEDURE Start*; 
 +  BEGIN 
 +      v.Log 
 +  END Start; 
 +   
 +  BEGIN 
 +      NEW (v); 
 +  END Test_pointer. 
 + 
 +  (!)Test_pointer.Start 
 +   
 +  компилируется "​Test_pointer" ​  ​92 ​  4 
 +  старый модуль Test_pointer выгружен 
 +  0.0
 Как видно из примера,​ при описании процедуры Log, при привязке метода к указательному типу, перед именем процедуры вместо ​ Как видно из примера,​ при описании процедуры Log, при привязке метода к указательному типу, перед именем процедуры вместо ​
   
bb/redbook/210.txt · Последние изменения: 2019/07/24 10:33 — caufman