
- •1.3.3. Классы
- •1.3.4. Возможность применения в специальных областях
- •2.1. Синтаксис
- •2.2. Семантика ,; V-
- •2.2.1. Подклассы
- •2.2.2. Сочленение . -
- •2.2.3. Виртуальные величины
- •4.3.2.2. Генераторы объектов ,
- •4.3.2.3. Локальный объект
- •4.3.2.4. Оперативная квалификация «
- •7. Дистанционное обращение
- •7.1.2. Семантика
- •10.8.2. Семантика
- •11.3.2. Семантика
- •1 12.1. Последовательности псевдослучайных чисел
- •14.2.1.2. Семантика-
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 — это нелокальная процедура).