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.
Те же характеристики верны и для 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]