x [nb]:= “n”;
if х[n1]=”0” then x [nb]:=”1”;
if х[n1]=”1” then x [nb]:=”0”;
end инвертор;
Классы автомат и инвертор можно описать не пользуясь префиксом класса элемент. Но тогда необходимо описывать правила действия класса элемент.
Виртуальные величины
Виртуальные величины служат двоякой цели:
· дать возможность обращения на одном префиксальном уровне некоторого объекта к атрибутам, объявленным на более высоком префиксальном уровне;
· позволить, декларировать атрибут заново на некотором префиксальном уровне так, чтобы эта новая декларация была действительна на более низком префиксальном уровне.
В совокупности виртуальных допускаются следующие спецификации:
label, switch, procedure и (тип) procedure.
Виртуальная величина некоторого объекта может быть или «холостой» (т.е. «без подходящего к ней атрибута»), или отождествляться с некоторым подходящим» атрибутом, каковым является атрибут, декларированный на не менее низком префиксальном уровне, чем уровень данной виртуальной величины, и имеющий идентификатор, совпадающий с идентификатором виртуальной величины. Подходящий атрибут должен быть того же самого рода, что и данная виртуальная величина. Тип подходящей процедуры должен совпадать или быть подчиненным типу данной виртуальной процедуры и типу любой подходящей процедуры, декларированной на более низких префиксальных уровнях.
Следствием определенного выше механизма сочленения является то, что виртуальная величина некоторого данного объекта может иметь не более одного подходящего атрибута. Если подходящие декларации заданы на нескольких префиксальных уровнях данной иерархии классов, то (для некоторого объекта) действует декларация, заданная на наивысшем уровне, меньшем или равном уровню ядра этого объекта. Действие подходящей декларации распространяется на все префиксальные уровни объекта, не меньшие уровня виртуальной спецификации.
Пример.
В следующем классе, выражающем понятие «расстановка», алгоритм «оценка» (функция расстановки) является «сменной частью».
class расстановка (n);
integer n;
virtual: integer procedure оценка;
begin
integer procedure оценка (T);
value T; text T;
begin
integer i;
L: if T . more then
begin
i : = i + rank (T. getchar);
go to L;
end;
оценка : = i - ([i/ n] * n)
end оценка ;
text array табл [0:n -1];
integer procedure номер(T, стар);
name стар;
value T; Boolean стар; text T;
begin
integer i;
i : = оценка (Т);
стар: = false;
L : if табл [i].length = 0 then
табл[i] : — T
else
if табл [i] = T then стар: = true
else i := i + 1;
if i=n then i := 0; go to L
end;
номер : = i
end номер
end расстановка ;
расстановка class АЛГОЛоценка;
begin
integer procedure оценка (T); value T; text T;
begin
integer i;
character С; L : if T . more then
begin
С: = T. getchar;
if С = "_'' then
i : = i + rank (T . getchar);
go to L;
end;
оценка : = i - ([i/ n] * n);
end оценка;
end АЛГОЛ оценка;
Создание объекта класса А3 должно задаваться генератором вида
‘NEW’ А3 (Р1, Р2, Р3);
Ссылочная переменная лил процедура – функция типа
‘REF’ (<КВАЛИФИКАЦИЯ>)
может указывать не только на объекты класса, который указан в квалификации, но и на объекты любого из его подклассов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.