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

[]_[] Ссылки на классы []_[]

Это элемент языка, который в процессе выполнения программы позволяет манипулировать не экземплярами классов а самими классами. Ссылка на класс – это не класс и не объект, это ссылка на тип данных.

Предположим, имеется класс TMyClass.

//Определим ссылку на этот класс

Type

TMyClassRef = class of TMyClass;

//Можно объявить переменные обоих типов

Var AClassRef : TMyClassRef;

AnObject : TMyClass;

Begin

AClassRef:= TMyClassRef;

AnObject:=TMyClass.Create;

End;

*Зачем нужны ссылки на класс?

-Они позволяют оперировать типами данных (классами) в процессе выполнения программы. Возможно использование ссылки на класс в любом выражении, в котором допускается упоминание типа данных. Таких случаев немного, но некоторые бывают очень полезны. В простейшем случае можно переписать код след.образом:

//Определим ссылку на этот класс

Type

TMyClassRef = class of TMyClass;

//Можно объявить переменные обоих типов

Var AClassRef : TMyClassRef;

AnObject : TMyClass;

Begin

AClassRef:= TMyClassRef;

AnObject:=TMyClass.Create;

//new

AClassRef:=TMyClass;

AnObject:=AClassRef.Create;

End;

*Здесь конструктор Create применен к ссылке на класс вместо настоящего класса.

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

Например:

Переменной типа ссылка на класс (TMyClassRef) можно присвоить как соответствующий ей конкретный класс, так и любой из его классов – потомков.

Type

TMyNewClass = class ( TMyClass )

End;

……………………..

AClassRef:=TMyClass;

AClassRef:=TMyNewClass;

В библиотеках RealTypeLibrary и ??? RealTimeLibrary ??? определено много ссылок на класс.

…………

Type

TClass = class of TObject;

ExceptClass = class of Exception;

TComponentClass = class of TComponent;

TControlClass = class of TControl;

TFormClass = class of Tform;

……………

Ссылку на класс типа TClass можно использовать для хранения ссылки на любой класс Delphi (т.к. ссылается на TObject).

Ссылка TFormClass используется в исходном коде большинства проектов Дельфи. Метод CreateForm объекта Application требует в качестве параметра класс формы, которую нужно создать.

Application.CreateForm(Tform1, Form1); //1 - ссылка на класс, 2 – переменная, хранящая ссылку на созданный экземпляр объекта.

Кроме того ссылку на класс можно применять к методам связанного с ней класса(или наоборот????).

Принимая во внимание что каждый класс наследуется от TObject, любую ссылку на класс можно применять к его методам.

Создание компонентов при помощи ссылок на класс

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

При добавлении нового компонента на форму когда мы выбираем его из палитры компонентов, на самом деле мы выбираем тип данных и создаем объект этого типа данных.

Здесь механизм ссылок на классы обеспечивает полиморфизм в процессе конструирования объекта.

Пример:

TButton TEdit TLabel

Форма имеет 3 переключатели, при выборе одного из них и щелчке на форме создается компонент соответствующего класса. Имя такое же как и в Дельфи происходит.

Форма должна иметь поле типа ссылка на класс.

Private

Class: TControlClass;

Counter:integer;

При щелчке на каждом из переключателей поле в ClassRef сохраняется соответсующий тип данных.

Procedure TFrom1.RadioButtonBtnClick(sender);

Begin

ClassRef:=TButton;

End;

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

Обработаем событие onMouseDown, нам понадобятся X и Y.

Procedure TFrom1.FormMouseDown( x y);

Var newCtrl:TControl; myName:string;

Begin

newCtrl:=ClassRef.Create(self);

newCtrl.Visible:=False;

newCtrl.Parent:=Self;

newCtrl.hight=x; newCtrl.Top:=Y;

inc(Counter);

myName:=ClassRef.ClassName+IntToStr(Counter);

Delete(myName,1,1);

End;

//используем вместо типа данных ссылку на класс. Используем ссылку на класс вместо …TObject.

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

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

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