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. | |