Советы по Delphi

         

Информация о TClass


TObject - "корневой" объект.

TClass определен как Class of TObject. Переменная Class НЕ является указателем на экземпляр объекта. Это указатель на *ТИП* объекта Class.

    Var
Obj1:  TWinControl; Class1:  Class of TWinControl;

Class1 := TWinControl - правильное присваивание. Мы не распределяем память, у нас нет экземпляра TWinControl, мы не можем вызвать Class1.OnClick.

Class1 - это *тип* TWinControl с тем же контекстом использования, что и "TWinControl".

Поскольку мы можем использовать TWinControl.Create, то также мы можем использовать и Class1.Create, при этом создавая новый экземпляр TWinControl.

С тех пор как TEdit - наследник TWinControl, Class1 := TEdit правильное присваивание и Class1.Create создает экземпляр TEdit.



Если у меня имеется переменная Obj2: TWinControl, и даже если я присвоил экземпляр TListbox Obj2, я не могу ссылаться на Obj2.Items, поскольку Obj2 определен как TWinControl, а TWinControl не имеет свойства Items.

Те же характеристики верны и для Class1. Class1 определен как Class of TWinControl, поэтому они имеют общий конструктор, определенный в классе TWinControl.

Это не пугает меня при создании дополнительных типов:

    TMyObj1 = Class (TEdit)
Constructor CreateMagic; Virtual; end;
TMyObj2 = Class (TMyObj1)
Constructor CreateMagic; override; end;
TMyClass = Class of TMyObj;

Var
MyObj1: TMyObj1; MyObj2: TMyObj2;
Function MakeAnother (AClass: TMyClass): TMyObj1; Begin
Result := AClass.CreateMagic; end;
Begin
MyObj2 := TMyObj2.CreateMagic; MyObj1 := MakeAnother (MyObj2.ClassType); end.

[000506]



Содержание раздела