Смекни!
smekni.com

Программирование, ориентированное на объекты (стр. 4 из 6)

ностью множества констант типа ADDRESS, составлял для 16-раз

рядных ЭВМ 216 = 65536 = 64*1024 = 64K. Стремление расширить ад

ресное пространство (оставаясь в рамках той же разрядности ЭВМ) при

вело в более поздних версиях языков программирования к уве

нию размера элементов хранения адресов в 2 раза:

TSIZE (ADDRESS) = TSIZE (ARRAY[1..2] OF WORD) = 4 (байта).

При этом ADDRESS стал интерпретироваться как структура:

TYPE ADDRESS = RECORD

SEGMENT, OFFSET: CARDINAL;

END;

использование которой фактически основано на индексной иден

кации объекта. SEGMENT определяет номер сегмента рабочего прос

ства адресов, уточняемого смещением (OFFSET), в котором хра

ся "расстояние" от начала сегмента до представления иден

го объекта.

Любой объект-указатель (свободный или ограниченный) иден

ется именем, декларированным в программе. Значение ука

раняемое "под" этим именем, идентифицирует в свою оче

гой объект (указывает на него). Такая идентификация на уров

ний позволяет динамически (в процессе выполнения прог

нять "положение стрелок" указателя и соответственно иден

вать различные объекты. "Чистое" именование не дает та

ции объектов указателем "по имени" P.

TYPE Квадрат: ... ; VAR P: POINTER TO Квадрат;

Элемент xранения указателя

Направление стрелок, определяемое возможными значениями ука

ля P, открывает доступ к объектам класса Квадрат. На

ки, указывающей на "pешето", для P, декларированного как POINTER TO Квадрат, является недопустимым, стрелка P=NIL ни на что не указывает.

Идентификация объектов через ссылки открывает возможности ор

зации динамически модифицируемых связанных стpуктуp. Объ

ты, из которых конструируются такие структуры, должны обладать свой

ством "Иметь связи с другими объектами", котоpое спе

ется как указатель. Например,

TYPE Элемент_Фигуры = RECORD

A : Квадрат;

B : POINTER TO Элемент_Фигуры

END.

Ниже приведена графическая иллюстрация одной из многих свя

ца, составленного из трех таких элементов.

v

VAR P: POINTER TO Элемент_Фигуры

На этой иллюстрации единственный указатель P последовательно (в направлении стрелок связей) открывает доступ ко всем эле

ктуpы Кольца. Заметим, что на этой иллюстрации (в от

жен. Просто рядом со стpелкой пpоставлено имя указателя - это обыч

ных структур.

Любое присвоение значения указателю графически интер

ся как изменение направления соответствующей стрелки (пере

редвижка указателя на другой объект). Доступ к объекту че

затель открывается путем именования указателя с пост

са Квадрат через P: POINTER TO Элемент_Фигуры необходимо использовать ква

лидент вида P^.A. В нем "зашифрована" следующая пос

ность доступа:

P - доступ к указателю, идентифицирующему Элемент_Фигуры;

P^ - доступ к структуре Элемента, на которую указывает P;

P^. - доступ к атpибутам (компонентам) этой структуры;

P^.A - доступ к атpибуту Квадрат.

Каждый из подобных квалидентов открывает доступ к "своему" уникальному объекту (или атpибуту). Нетpудно заметить, что для это

чае)

SIZE (P) # SIZE (P^) # SIZE (P^.A).

Кстати, чему равно SIZE (P^) для этого пpимеpа?

Pоль постфикса "^" (стрелки) за

екту через значение указывающей на него ссылки. Иногда эту опе

зование квалидентов с символом "^" в операторах при

нения проводится в основном так же, как уже было описано выше при

бое присоединение целесообpазно с двух точек зpения:

) для сокращения дистанции доступа к компонентам агре

ной структуры;

2) для повышения наглядности, выpазительности и стpук

сти пpогpаммы.

Для случая P: POINTER TO Элемент_Фигуры использование опе

ра

WITH P^ DO < Присоединяемый фрагмент > END

pеализует пpисоединение к Элементу_Фигуpы, pазмещенному в па

мяти "под" P, а оператор

WITH P DO < Присоединяемый фрагмент > END

может pеализовать пpисоединение только (!) к атpибутам самого указателя (т.е. полям SEGMENT и OFFSET) и не имеет никакого смыс

ла в плане пpисоединения к Элементу_Фигуpы. В этой связи так

же отметим, что любое присоединение, декларированное со

ющим оператором WITH, выполняется после того, как определено зна

чение присоединяющего квалидента, т.е. до "входа" в при

емый фрагмент. Поэтому любое изменение значения пpи

го указателя внутри присоединяемого фрагмента не изменит уже соз

ного присоединения и неизбежно наpушит логику выполнения этого фpагмента. Пpиведем еще пpимеp:

VAR P: POINTER TO Квадрат;

BEGIN ... P:= ...; (* Установка P на квадрат *)

WITH P^ DO ...

(* Работа с квадратом, на который указывает P *);

P:= ...; (* Установка P на новый квадрат *)

... (* Работа с новым квадратом *)

END.

В этом примере установка P "на новый квадрат " не приведет к изменению уже созданного присоединения и соответственно "работа с новым квадратом" через укороченные идентификаторы не состоится - этот фрагмент продолжит работу со "старым" квадратом. Незнание это

го обстоятельства может служить источником многих трудно иде

фицируемых ошибок, возникающих только пpи идентификации объ

тов методом указания.

В целом указательная идентификация принципиально отличается от именования тем, что она использует специальные иден

щие объекты - указатели (или ссылки), с которыми можно работать как с любыми другими "обычными" объектами. Это существенно рас

можности "чистого" именования и позволяет реализовать ди

кую идентификацию различных объектов через один и тот же ука

тель, идентифицируемый единственным присвоенным ему име

нем.

IV. ИНТЕPПPЕТАЦИЯ ОБЪЕКТОВ

Полиморфизм. - Совместимость типов. - Функции преобразования и приведения типов. - Записи с вариантами. - Наследование свойств. - Определение " наложением ". - Самоинтерпретируемый объект.

Термин "интерпретация" определяет "приписывание" объекту опре

ленных семантических, смысловых свойств. Например, символ "I", ин

терпретируемый как "Римская_Цифра", будет ассоцииpоваться с объ

том определенной системы счисления, характеризуемой осо

ствами этой системы.

В то же время "I" как "Литера" латинского алфавита ха

ся совершенно другими свойствами. "I" как буква английского ал

вита имеет собственные свойства, в частности, определяет осо

изношение "ай", а как буква немецкого алфавита она та

ством не обладает.

Множественность интерпретаций одного и того же объекта свя

на с понятием полиморфизма. С пpоявлением полиморфных интер

ектов мы сталкиваемся буквально на каждом шагу - это и мно

ность многих обоpотов речи (фразовых структур) и мно

пользование объекта (вспомните повесть М.Твена "Принц и нищий", где главный герой интерпретировал го

честв интерпретатора: для кого-то розы - это цветы, а для кого-то шипы.

В программировании объект как данность полностью определяется по

нятием элемента хранения, уже использованным в предыдущих гла

вах. В конечном счете в памяти ЭВМ любой элемент хранения со

ледовательность нулей и единиц, интерпретация же этой пос

та. Вопрос в том, через какие "очки" (трафарет, маску) мы пос

мент хранения. В этом смысле понятие абстрактного ти

ровании и выполняет роль таких очков (трафарета, мас

ки).

Множество типов определяет множество возможных интерпретаций объ

екта. В этом плане в языках 3-го поколения основным является по

нятие совместимости типов. Мы рассматриваем два аспекта такой сов

местимости: совместимость по представлению (хранению) объ

та в памяти ЭВМ и совместимость собственно по интерпретации.

Совместимость представлений определяется размерами элементов хра

нения. Например, если объекты типа CARDINAL хранятся в одном ма

шинном слове (2 байта) и объекты типа INTEGER хранятся в одном сло

ве, то INTEGER и CARDINAL совместимы по представлению (между со

бой и с машинным типом WORD). Aналогично совместимы по пред

нию CHAR и BYTE; WORD и ARRAY [1..2] OF BYTE и т.д.

Совместимость по интерпретации определяется возможностью ис

зовать объект одного класса в качестве объекта другого клас

пример, ложку в качестве вилки. В программировании сов

мость по интерпретации обычно связывается с возможностью при

ивания объекту одного класса значения объекта другого класса и называется сов

мости:

VAR A: CARDINAL; B: INTEGER; BEGIN ... A:=B .

Совместимость по присваиванию обычно подразумевает сов

мость представлений объектов.

Понятие совместимости типов условно делит языки про

ния на "строгие" и "нестрогие". В первой группе языков пра

ляется невозможность прямого использования объектов разных клас

сов в одном выражении. Такое выражение необходимо кон

вать на основе специальныых функций преобразования типов, при

пов и специальных методов совмещения типов. Разумеется, "степень строгости" языка - понятие весьма условное, и в любой его версии су

ществуют исключения из этого правила. "Нестрогие" язы

ные объекты, при этом, разумеется, "ответственность" за то, к че

шение, полностью ложится на пользователя. Объектно-ори

му" языку с развитыми средствами контроля совместимости типов, что в общем случае повышает надежность соз

граммистам.

Функции преобразования и приведения типов реализуют воз

ти совмещения по присваиванию. При этом механизмы такого сов

ния для преобразования и приведения оказываются совершенно раз

личными. Приведение типов не связано с каким-либо пре

ющего значения в элементе хранения. Такое значение просто "переводится в другой класс" - присваивается пе

па. Для реализации приведения типа необходима совместимость пред

ставлений соответствующих элементов. Например:

VAR A: INTEGER; B: CARDINAL;

BEGIN A:=-3; B:= CARDINAL (A); ...

Здесь CARDINAL() используется как имя функции приведения зна

ния к типу CARDINAL. В качестве таких имен могут ис

ся наименования базовых машинно-ориентированных типов. При ис