СИМУЛА - универсальный процессо-ориентированный язык моделирования, страница 7

Пусть имеются следующие описания ссылочных переменных:

‘REF’ (А1) Е1; ‘REF’ (А2) Е2; ‘REF’ (А3) Е3;

переменная Е1 может ссылаться на объекты классов А1, А2, А3; Е2 – на объекты классов А2, А3; Е3 – только на А3.

2.3. СРЕДСТВА ДОСТУПА Е АТРИБУТАМ ОБЪЕКТОВ

При описании классов все переменные, которые объявлены в данном классе, непосредственно доступны по их именам. Если  декларация класса имеет префикс, то в ее операторах непосредственно доступны переменные всех надклассов.

Доступ к атрибутам объектов вне определения класса выполняется с помощью дистанционных идентификаторов, которые содержат обозначение объекта и имя атрибута, к которому производится обращение.

Дистанционный идентификатор имеет вид:

Е.Х, где Е – обозначение объекта, а Х – идентификатор атрибута. Если значением Е является ‘NONE’, то использование Е.Х приведет к ошибке.

В примере 2.3 ссылочная переменная А1 указывает на объект типа автомобиль с параметрами Т=”КАМАЗ“, GR=5.3, LP=2000, LT=100. В этом случае к атрибутам данного объекта А1 можно обращаться следующим образом.

ПРИМЕР 2.5

А1.LP:=А1.LP+1000:

А1.LT:=А1.LT+1000:

В данном примере значение переменной общего пробега и пробега после ремонта увеличивается на 1000.

Автомобиль в этом случае называется квалификацией объектного выражения А1, если объектное выражение имеет вид переменной (простой или с индексами) или указателя функции, то его квалификацией считается квалификация, указанная в описании этой переменной (массива, процедуры-функции). Квалификация генератора объектов или локального объекта – идентификатор класса, записанный после ‘NEW’ или ‘THIS’.

Пусть С – квалификация объектного выражения. В этом случае с помощью конструкции Е.Х можно обращаться только к тем атрибутам объекта, которые заданы в декларации класса о или его надклассов, т.е. класс о необходимо рассматривать как заданный эквивалентной декларацией.

Рассмотрим пример. Пусть задан следующий фрагмент СИМУЛА - программы:

ПРИМЕР 2.6

‘REF’ (А) А1; ‘REF’ (З) В1; ‘REF’ (С) С1;

‘CLASS’ А(Х); ‘REAL’ Х;  ‘BEGIN’ … ‘END’;

А ‘CLASS’ B(Y); ‘REAL’ (A) Y;  ‘BEGIN’ … ‘END’;

В ‘CLASS’ C; ‘BEGIN’ … ‘END’;

А1:- ‘NEW’ А(6); В1:-  ‘NEW’ (12, А1);

С1:- ‘NEW’ С(7, А1);

Обращаться к атрибутам созданных объектов можно с помощью дистанционных идентификаторов через переменные А1, В1, С1 из левой точки программы, на которую распространяется действие их описания, т.е. в том блоке, где описаны переменные А1, В1, С1.

Например, значение А1.Х равно 6, а В1.Х – 12, С1.Х – 7. значение В1.Y равно ссылочной переменной А1, а значение В1.Y.Х – 6, значение С1.Y.Х – 10, после выполнения оператора В1.Х:=С1.Х+В1.Y.Х; Атрибут Х объекта В1 будет иметь значение 13.

Дистанционные идентификаторы, использующие локальный объект, позволяют в теле декларации подкласса обращаться к тем атрибутам, которые непосредственно недоступны из-за конфликтов наименования. Например, если в теле декларации класса С необходимо увеличить атрибут Х на атрибут Х класса А, то необходимо выполнить оператор

Х:=Х+’THIS’ А.Х;

Допустим, в описании действий некоторого класса необходимо сослаться на объект, принадлежащий подклассу, чтобы обратиться к атрибутам этого объекта подкласса. Необходимо применить оперативную квалификацию, которая имеет вид:

‘QUA’ C, где С – идентификатор класса. Оперативная квалификация пишется после имени ссылочной переменной.

В примере 2.6 классы В и С являются подклассами класса А. Поэтому ссылочная переменная А1 может ссылаться на объект классов В и С. например, оператор А1:-В1 заставит А1 указывать на тот же объект, что и В1. однако ссылаться к атрибуту Y с помощью дистанционного идентификатора А1.Y нельзя. Это можно сделать с помощью оперативной квалификации следующим образом:

А1 ‘QUS’ C.Y

С помощью дистанционных идентификаторов можно обращаться к атрибутам – массивам и к атрибутам – процедурам.