Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП / ООП_Лекции.doc
Скачиваний:
55
Добавлен:
08.06.2015
Размер:
1.03 Mб
Скачать

Операции с классами

Для классов определены операции отношения = и <>. Кроме того, для классов определены еще две операции: as (как) и is (яв­ляется). Первым операндом в обеих операциях является объект, вторым — класс.

Если А — объект, а С — класс, то выражение A as С возвраща­ет тот же самый объект, но рассматриваемый как объект клас­са С. Операция даст результат, если указанный класс С является классом объекта А или одним из наследников этого класса. В противном случае будет сгенерировано исключение.

Наиболее часто операция as применяется к параметру Sender, передаваемому во все обработчики событий как объект — источ­ник события и имеющему тип TObject, в котором очень мало свойств для идентификации объекта. Например:

if (Sender as TComponent) .Name = 'Button2' then ...;

Этот оператор выбирает событие, связанное с компонентом, имеющим имя «Button2», и не реагирует на события, связанные с другими компонентами.

Выражение A is С позволяет определить, относится ли объект А к классу С или к одному из его потомков. Если относится, то операция is возвращает true, в противном случае — false. Напри­мер, оператор:

if Sender is TButton then ...;

будет реагировать только на объекты класса TButton или потом­ков этого класса.

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

<объект-приемник>.Assign(<объект-источник>); Например:

A.Assign (В);

Этот оператор копирует содержание объекта А (все его свойст­ва) в объект В.

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

А:=B;

Различие между двумя приведенными операторами следую­щее. Метод Assign копирует содержимое одного объекта в дру­гой. Таким образом в памяти будет иметься два объекта А и В одинакового содержания. А оператор присваивания, применен­ный к указателям (имя объекта — это указатель на объект), при­сваивает указателю А значение указателя В. Таким образом, и А, и В будут указывать на один и тот же объект в памяти. А тот объ­ект, на который до выполнения этого оператора указывал А, мо­жет быть вообще потерян, если в программе где-то не хранится другой указатель на него.

Ссылки на классы

Особый элемент языка Object Pascal — это поддержка ссылок на классы. Это — объекты, сохраняющие информацию о каждом классе в целом («метаклассы» по терминологии языка Smalltalk или Borland C++Builder) вместо хранения информации для определенного экземпляра класса. Ссылка (reference) на класс в Delphi имеет специальный тип данных, объявленный как:

type

TMyCRef := class of TMyClass;

var

MyCRef: TMyCRef;

В этом примере тип данных ссылки на класс TMyCRef может относиться только к классу TMyClass и его подклассам. Другими словами, ссылки на класс используют правила совместимости типа, связанные с наследованием, точно так же, как другие объекты. Delphi VCL определяет несколько таких ссылок на классы, как TClass (являющийся классом TObject), TComponentClass, TControlClass и многие другие. Как предполагается, ссылке на класс TClass можно присвоить любой класс (все классы происходят от TObject; а все ссылки на класс - от TClass). Однако так чаще всего работают с классами компонентов или элементов управления.

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

Соседние файлы в папке ООП