Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Подклассы



Декларация класса с префиксом С и идентификатором класса D определяет некоторый подкласс D класса С. Объект, принадлежащий к этому подклассу, состоит из «префиксной части», которая сама по себе является объектом класса С, и из «ядра», описываемого ядром декларации класса. Эти две части «сочленяются» в один составной объект, Класс С сам может иметь префикс.

Пусть С1, С2,..., Сп суть классы, причем С1 не имеет префикса, а Сk имеет префикс Ck-1 (k = 2, 3,..., п). Тогда С1, С2 ,..., Ck-1 называются последовательностью префиксов для Ck (k = 2,3,..., ft). Индекс k у Ck (k = 1, 2,.., n) называется «префиксальным уровнем» класса Сk. Говорят, что, класс Ci объемлет класс Cj (или что класс Cj содержится в классе С i), если i<=j, и класс Cj называется подклассом класса С i,если i>j (i,j = 1,2,..., n). Считается, что префиксальный уровень класса D «выше» префиксального уровня класса С, если D является подклассом класса С.

Ниже на рис..5.1 и 5.2 графически представлены иерархия классов и структура объектов, принадлежащих к каждому из них:

class A …;

A class B …;

B class C …;

B class D …;

A class E …


Рис.5.1 Иерархия классов

A B C D E


Рис.5.2. Структуры объектов

При употреблении префиксов необходимо соблюдать следующие ограничения:

· ни один класс не должен встречаться в своей собственной последовательности префиксов;

· класс может быть употреблен в качестве префикса лишь на том блочном уровне, где он декларирован.

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

При реализации языка может быть наложено ограничение на количество различных блочных уровней, на которых можно употреблять такие префиксы.

Сочленение

Пусть Сп — класс, имеющий последовательность префиксов С1 , С2, …, Сп-1 и пусть X — объект, принадлежащий классу Сn. Тогда механизм сочленения приводит по существу к следующему:

· Совокупность атрибутов объекта X является объединением совокупностей атрибутов, определенных в С1, С2,..., Сп. Относительно атрибута, декларированного в классе Ck (1<=k<=n), говорят, что он определен нa префиксальном уровне k.

· X имеет «правило действий», состоящее из операторов,
взятых в некотором определенном порядке (см. ниже) из тел
упомянутых классов. Считается, что оператор, содержащийся
в теле класса Сk принадлежит префиксальному уровню k.

· Из оператора префиксального уровня k можно обращаться ко всем атрибутам объекта X, определенным на префиксальном уровне k или ниже, за исключением атрибутов, сделавшихся недоступными из-за противоречащих определений на более высоких уровнях (<= k).

· Из оператора префиксального уровня k объекта X невозможно непосредственно обращаться к атрибутам этого объекта, определенным на префиксальных уровнях выше k, кроме как через виртуальные величины.

· В расщепленном теле класса уровня k символ inner представляет те операторы правила действий объекта X, которые принадлежат уровням выше, чем k, или пустой оператор, если k = n. Если ни один из классов С1,..., Сп-1 имеет расщепленного, тела, операторы правила действий объекта X упорядочены по возрастанию префиксальных уровней.

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

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

Отметим, что неэкранированное вхождение идентификатора в некоторый блок вполне может иметь локальный в этом блоке смысл.

Процесс сочленения деклараций классов выполняется в порядке возрастания блочного уровня.

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

· Если префикс отсылает к сочлененной декларации класса, в которой уже выполнены замены идентификаторов, то такие же замены выполняются для всех неэкранированных вхождений идентификаторов в ядро.

· Если затем идентификаторы атрибутов, определенные в ядре, имеют неэкранированные вхождения в префикс-класс, то для того, чтобы избежать конфликтов наименований,- все неэкранированные вхождения таких идентификаторов в ядро систематически заменяются. Однако идентификаторы, соответствующие виртуальным величинам, определенным в префикс-классе, изменению не подлежат.

Сочлененная декларация класса может быть теперь определена в терминах данной декларации (модифицированной, как только что было описано) и сочлененной декларации префикс-класса:

· Список формальных параметров сочлененной декларации состоит из списка формальных параметров префикс-класса, за которым следует список формальных параметров ядра.

· Список значений, совокупность спецификаций и совокупность виртуальных сочлененной декларации являются объединениями (в неформальном, но очевидном смысле) соответственно списков значений, совокупностей спецификаций и совокупностей виртуальных префикс-класса и ядра. Если получающаяся таким образом совокупность виртуальных содержит несколько вхождений одного и того же идентификатора, то совокупность виртуальных данного класса считается
недопустимой.

· Тело класса сочлененной декларации получается из тела ядра (в предположении, что тело префикс-класса является расщепленным) следующим образом. Символ begin начала блока заменяется копией начала блока тела префикс-класса; вслед за началом блока ядра вставляется копия начальных действий тела префикс-класса; символ end, замыкающий ядро, заменяется копией конца составного, которым оканчивается расщепленное тело префикс-класса. Если же тело префикс-класса не является расщепленным, то оно интерпретируется так, как если бы перед замыкающим его символом end были вставлены символы inner.

Если в получившемся таким образом теле класса оказались две декларации для одной виртуальной величины, то та из них, которая возникла при копировании из тела префикс-класса, удаляется. Декларацией метки является ее вхождение в блок в качестве метки некоторого оператора.

Пример 1.

class точка (х, у);

real х, у;

begin

ref (точка) procedure плюс(Р);

ref (точка) Р;

плюс: — new точка (х + Р. х, у + Р.у);

end точка;

Объект класса точка является представлением некоторой точки декартовой плоскости. Он имеет атрибуты х, у и плюс, причем плюс представляет операцию сложения векторов.

точка class поляр;

Begin

real r, v;

ref (поляр) procedure плюс(Р);

ref (точка) Р;

плюс: — new поляр (х + Р.х, у + Р.у);

r: = sqrt (x**2 + y**2);

v: = arctg (x, у)

end поляр;

Объект класса поляр — это объект точка с дополнительными атрибутами rи v и с заново определенной операцией плюс. Значения переменных rи v вычисляются и присваиваются этим переменным во время порождения объекта, (arctg — это нелокальная процедура).

Пример 2.

Пусть необходимо описать алгоритм работы некоторой серии микросхем, каждая их микросхем имеет свой алгоритм работы, но и некоторые общие свойства. Опишем класс элемент, являющийся подклассом некоторого системного класса process (см. далее). Параметры класса элемент являются количество входов (квх) и выходов микросхемы (квых). Данный класс описывает символьный массив размерности квх+квых и переходит в пассивное состояние (см. далее), затем должны выполняться правила действий конкретного элемента. И элемент переходит в пассивное состояние до новой активизации. После чего правила действий конкретного элемента повторяются:

process class элемент (квх, квых);

integer квх, квых;

Begin

character array х [1; квх+квых];

passivate;

работа: inner;

passivate;

go to работа;

end элемент;

Все элементы делятся на два подкласса: комбинационные элементы (элементы без памяти) и элементы типа автомат (элементы с памятью).

Опишем класс автомат, являющийся подклассом элемент. В классе автомат мы должны запоминать предыдущее состояние и время изменения сигнала. Для этого в теле класса автомат определяется символьный массив xot размерности квх+квых и массив действительных чисел tизм размерности квх+квых. Далее идет описание правил действия (inner). После чего запоминается старый сигнал и время его изменения.

элемент class автомат;

Begin

character array хot [1; квх+квых];

real array tизм [1;квх+квых];

Inner;

for i:=1 step 1 until квх+квых

Do

if хот [i] ne x [i] then

Begin

xot [i]:= x [i];

tизм [i]:= time;

End

end автомат;

Комбинационный элемент инвертор можно описать следующим образом:

элемент class инвертор;

Begin

integer n1, nb;

n1:=01; nb:=02;

x [nb]:= “n”;

if х[n1]=”0” then x [nb]:=”1”;

if х[n1]=”1” then x [nb]:=”0”;

end инвертор;

Классы автомат и инвертор можно описать не пользуясь префиксом класса элемент. Но тогда необходимо описывать правила действия класса элемент.





Дата публикования: 2015-01-23; Прочитано: 213 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.025 с)...