- •Методы объектов
- •Методы класса и данные класса
- •Инкапсуляция
- •Директивы видимости
- •Инкапсуляция при помощи свойств(новое в дельфи)
- •Свойства массивы
- •Многомерные массивы свойств
- •Индексированные свойства
- •Ссылочная модель Дельфи. (см тетрадь) Наследование
- •Наследование и совместимость типов
- •Безопасное преобразование типов
- •Интерфейсы
- •Технические приемы, связанные с реализацией интерфейса.
- •Обработка исключений.
- •Создание пользовательской особой (исключительной ситуации)
- •[]_[] Ссылки на классы []_[]
- •Создание компонентов при помощи ссылок на класс
- •Класс tObject
- •Конструктор Create класса tObject.
- •События.
- •Указатели на методы
- •If sender.InheritsFrom(tButton) then…
- •If sender is tButton then….
[]_[] Ссылки на классы []_[]
Это элемент языка, который в процессе выполнения программы позволяет манипулировать не экземплярами классов а самими классами. Ссылка на класс – это не класс и не объект, это ссылка на тип данных.
Предположим, имеется класс 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.
Тут есть элемент полиморфизма. Чтобы сработал механизм полиморфного конструирования, базовый тип класса, на который ссылается переменная типа ссылка на класс, должен обладать виртуальным конструктором.
Если базовый класс обладает виртуальным конструктором, то при обращении конструктору ссылки на класс будет выполнен метод, являющийся конструктором того класса, на который в данный момент ссылается ссылка на класс. Если же конструктор базового типа не виртуальный, то при обращении к конструктору ссылки на класс будет вызван конструктор фиксированного типа, указанного при объявлении переменной.