![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Создание объекта класса А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.
При описании классов все переменные, которые объявлены в данном классе, непосредственно доступны по их именам. Если декларация класса имеет префикс, то в ее операторах непосредственно доступны переменные всех надклассов.
Доступ к атрибутам объектов вне определения класса выполняется с помощью дистанционных идентификаторов, которые содержат обозначение объекта и имя атрибута, к которому производится обращение.
Дистанционный идентификатор имеет вид:
Е.Х,
где Е – обозначение объекта, а Х – идентификатор атрибута. Если значением Е является none, то использование Е.Х приведет к ошибке.
Пусть С – квалификация объектного выражения. В этом случае с помощью конструкции Е.Х можно обращаться только к тем атрибутам объекта, которые заданы в декларации класса о или его надклассов, т.е. класс о необходимо рассматривать как заданный эквивалентной декларацией.
Рассмотрим пример. Пусть задан следующий фрагмент СИМУЛА - программы:
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,
где С – идентификатор класса. Оперативная квалификация пишется после имени ссылочной переменной.
В приведенном выше примере классы В и С являются подклассами класса А. Поэтому ссылочная переменная А1 может ссылаться на объект классов В и С. например, оператор А1:-В1 заставит А1 указывать на тот же объект, что и В1. однако ссылаться к атрибуту Y с помощью дистанционного идентификатора А1.Y нельзя. Это можно сделать с помощью оперативной квалификации следующим образом:
А1 qua C.Y
С помощью дистанционных идентификаторов можно обращаться к атрибутам – массивам и к атрибутам – процедурам.
С помощью атрибутов – процедур удобно задавать такие операции над объектами, которые могут инициироваться как самим объектом, так и извне его, т.е. другими объектами. Таким образом, можно описывать абстрактные типы данных с системой операций над ними. Рассмотрим в качестве примера описание класса точка, задающего точки, которые располагаются на плоскости. Причем каждая из них характеризуется координатами (x,y) и обладает способностью двигаться в вертикальном и горизонтальном направлениях.
class point (x,y):
real x,y;
Begin
procedure right (s);
real s;
Begin
x:=x+s;
End;
procedure top (h)
real h;
Begin
y:=y+h;
End;
end;
Разместить на плоскости точки a и b с координатами (1,2) и (3,4) можно с помощью следующего фрагмента программы:
ref (point) a, b;
a:- new point (1,2);
b:- new point (3,4);
Сдвинуть точку a вправо на 7 единиц можно с помощью оператора a.right (7), влево на 4 единицы – с помощью оператора a.right (-4). Если нужно поднять точку a на столько единиц, каково значение суммы координат точки b, то необходимо выполнить оператор a.top(b.x+b.y).
Далее приведена декларация класса вектор, построенная на основе декларации класса точка, которая определяет двумерные вектора с началом в точке (0,0) и операцию сложения векторов.
point class vector;
Begin
ref (vector) procedure plus (p);
ref (vector) p;
plus:- new vector (x+ p.x,y+ p.y);
End;
Иногда необходимо для всех атрибутов использовать дистанционные идентификаторы. Это удобно делать с помощью присоединяющего оператора. Наиболее употребительная форма присоединяющего оператора имеет вид:
inspect e do s;
где e – объектное выражение, а s – оператор, в котором можно обращаться к атрибутам объекта e непосредственно по их именам. Объект е принято называть присоединенным объектом, а s – присоединяющим блоком.
Если при присоединении к объекту нужно выполнять различные действия в зависимости от того, к какому классу принадлежит этот объект, то применяется другая форма присоединяющего оператора:
inspect e when a1 do s1
when a2 do s2
……………………..
when ak do sk
где a1, a2, …, ak – идентификаторы классов, а s1, s2, …, sk - операторы, причем в si (i=1,2,…,k) возможно непосредственное использование атрибутов объекта ei, заданных в декларации класса ai.
Дата публикования: 2015-01-23; Прочитано: 203 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!