
- •Глава 6. Симула - универсальный процессо-ориентированный язык моделирования
- •Классы и объекты
- •Декларации класса
- •Подклассы
- •Объекты. Создание и средства доступа к атрибутам объекта
- •2.3. Средства доступа е атрибутам объектов
- •Квазипараллельное выполнение
- •Оператор detach (открепить)
- •Оператор resume (возобновить)
- •Выход через «end» объекта
- •Операторы перехода
- •Обработка упорядоченных множеств
- •Планирование процессов. Системный класс simulation
- •Статистические аспекты языка симула
- •Общая структура программы моделирования
- •Программное моделирование работы карьера
- •Описание классов
- •Текст программы
- •Ввод-вывод в симула
- •Понятие текста
- •Text array таблица [1:n];
- •Создание текстовых объектов
- •Процедуры работы с частью текста
- •Процедуры обработки текстов
- •Взаимное преобразование текстовых и арифметических значений
- •Сравнение текстов
- •Организация ввода – вывода
- •Процедуры ввода
- •Процедуры вывода
- •Контрольные вопросы и задания Литература
Объекты. Создание и средства доступа к атрибутам объекта
Создание объекта класса А3 должно задаваться генератором вида
‘NEW’ А3 (Р1, Р2, Р3);
Ссылочная переменная лил процедура – функция типа
‘REF’ (<КВАЛИФИКАЦИЯ>)
может указывать не только на объекты класса, который указан в квалификации, но и на объекты любого из его подклассов.
Пусть имеются следующие описания ссылочных переменных:
‘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
С помощью дистанционных идентификаторов можно обращаться к атрибутам – массивам и к атрибутам – процедурам.
С помощью атрибутов – процедур удобно задавать такие операции над объектами, которые могут инициироваться как самим объектом, так и извне его, т.е. другими объектами. Таким образом, можно описывать абстрактные типы данных с системой операций над ними. Рассмотрим в качестве примера описание класса точка, задающего точки, которые располагаются на плоскости. Причем каждая из них характеризуется координатами (Х,Y) и обладает способностью двигаться в вертикальном и горизонтальном направлениях [1].
ПРИМЕР 2.7
‘CLASS’ ТОЧКА (X,Y): ‘REAL’ X,Y;
‘BEGIN’
‘PROCEDURE’ ВПРАВО (S); ‘REAL’ S; X:=X+S;
‘PROCEDURE’ ВВЕРХ (H) ‘REAL’ H; Y:=Y+H;
‘END’;
Разместить на плоскости точки А и В с координатами (1,2) и (3,4) можно с помощью следующего фрагмента программы:
‘REF’ (ТОЧКА) А, В;
А:-‘NEW’ точка (1,2);
В:-‘NEW’ точка (3,4);
Сдвинуть точку А вправо на 7 единиц можно с помощью оператора А.ВПРАВО (7). А влево на 4 единицы – с помощью оператора А.ВПРАВО (-4). Если нужно поднять точку А на столько единиц, каково значение суммы координат точки В, то необходимо выполнить оператор А.ВВЕРХ (В,Х+В,У).
Далее приведена декларация класса вектор, построенная на основе декларации класса точка, которая определяет двумерные вектора с началом в точке (0,0) и операцию сложения векторов.
ПРИМЕР 2.8
ТОЧКА ‘CLASS’ ВЕКТОР;
‘BEGIN’
‘REF’ (ВЕКТОР) ‘PROCEDURE’ ПЛЮС (Р); ‘REF’ (ВЕКТОР) Р;
ПЛЮС:-‘NEW’ ВЕКТОР ( X+P, X ,Y+P, Y);
‘END’;
Иногда необходимо для всех атрибутов использовать дистанционные идентификаторы. Это удобно делать с помощью присоединяющего оператора. Наиболее употребительная форма присоединяющего оператора имеет вид:
‘INSPECT’ E ‘DO’ S;
где Е – объектное выражение, а S – оператор, в котором можно обращаться к атрибутам объекта Е непосредственно по их именам. Объект Е принято называть присоединенным объектом, а S – присоединяющим блоком.
С использованием данного оператора Пример 2.5 будет иметь вид:
‘INSPECT’ A1 ‘DO’
‘BEGIN’ LP:= LP+1000; LT:= LT+1000;
‘END’;
Если при присоединении к объекту нужно выполнять различные действия в зависимости от того, к какому классу принадлежит этот объект, то применяется другая форма присоединяющего оператора:
‘INSPECT’ E ‘WHEN’ A1 ‘DO’ S1
‘WHEN’ A2 ‘DO’ S2
……………………..
‘WHEN’ A2 ‘DO’ S2
где А1, А2, …, АК – идентификаторы классов, а S1, S2, …, SК - операторы, причем в Si (i=1,2,…,K) возможно непосредственное использование атрибутов объекта Е, заданных в декларации класса Аi, если У принадлежит классу (или одному из его подклассов), то исполняется оператор Si. После чего управление передается на оператор, следующий за всем присоединяющим оператором.