Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Симула.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
393.73 Кб
Скачать

2.2.1. Подклассы

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

Пусть Си С% ..., Сп суть классы, причем С{ не имеет пре­фикса, а Си имеет префикс Ck~\ (k = 2, 3,..-., п). Тогда Сь С2,..., Ck-i называются последовательностью префиксов для

Ch (A = 2,3, ..., ft). Индекс k у Ch (k = 1, 2, ;.., ft) назы­вается «префиксальным уровнем» класса С&. Говорят, что , класс Ci объемлет класс Cj (или что класс Cj содержится в "классе С*), если i^.j, и класс Q называется подклассом класса Cjt если />/ (*",/ = 1,2, ..., п). Считается, что пре­фиксальный уровень класса D «выше» префиксального уровня класса С, если D является подклассом класса С.

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

class A ...;

A class В ...;

В class С ...;

, ■ В class Z)...;-.

Л class Е ...:

А ВС D E

С D

A

a

a

a

4 ■

a

a

b

b

b

e

■ ■ ■

w

с

Л

d

ш

Взаимоотношения классов

Структуры объектов

Заглавные буквы обозначают классы. Малые буквы пред­ставляют атрибуты ядра объекта, принадлежащего классу, обозначенному соответствующей заглавной буквой. При реа­лизации языка структуры объектов, показанные на схеме, могли бы соответствовать размещению в памяти значений атрибутов, являющихся простыми переменными.

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

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

класс может быть употреблен в качестве префикса лишь на том блочном уровне, где он декларирован. Иденти­ фикатор системного класса, употребленный в качестве пре­ фикса, считается относящимся к некоей фиктивной деклара­ ции этого системного класса, якобы имеющейся в начале наи­ меньшего объемлющего блока. При реализации языка может быть наложено ограничение на количество различных блоч­ ных уровней, на которых можно употреблять такие префиксы (см. разд. 11, 14 и 15).

2.2.2. Сочленение . -

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

к следующему: . ( . ■ . - ,.■-'.

Совокупность атрибутов объекта X является объеди­ нением совокупностей атрибутов, определенных в Си С2,... ..., Сп. Относительно атрибута, декларированного в классе Ck (I <l/z^Cn), говорят, что он определен rfa префиксальном- уровне k. ■

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

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

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

йй

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

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

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

в некоторый блок вполне может иметь локальный в этом блоке смысл.)

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

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

■декларация, сперва модифицируется в соответствии со сле­дующими двумя правилами:

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

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

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

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

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

Тело класса сочлененной декларации получается из тела ядра (в предположении, что тело префикс-класса

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

оканчивается расщепленное тело префикс-класса. Если же тело префикс-класса не является расщепленным, то оно ин­терпретируется так, как если бы перед замыкающим его сим­волом end были вставлены символы ; inner ;.

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

Примеры;

class Сточка (х, у); real х, у\ -

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

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

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

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

begin real r, v ; \

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

плюс : — new поляр (х + Р .х, у + Р .у)', r: = sqrt (jtf2 + //f2); v : = arctg (x, у) end поляр;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]