Обычный способ сделать это с помощью виртуальных конструкторов.Хороший пример - TComponent
, который вам, без сомнения, знаком.
TComponent
имеет следующий конструктор:
constructor Create(AOwner: TComponent); virtual;
Другой ключ к этому - TComponentClass
, который объявлен какclass of TComponent
.
Когда VCL выполняет потоковую передачу файлов .dfm, он читает имя класса из файла .dfm и, с помощью какого-то процесса, который нам здесь не нужен, преобразует это имя в переменную.ComponentClass
скажем, типа TComponentClass
.Затем он может создать экземпляр объекта с помощью:
Component := ComponentClass.Create(Owner);
Это большое преимущество наличия виртуального конструктора, и я призываю вас использовать тот же подход.
Если вам нужно использоватьstring, чтобы идентифицировать класс, тогда вам все равно нужно будет найти подпрограмму поиска для преобразования имени класса строки в ссылку на класс.Вы могли бы, если это удобно, подключиться к тому же механизму VCL, который использует TComponent
, а именно RegisterClass
.
В качестве альтернативы, если бы вы могли заменить name
в своем коде ссылкой на класстогда вы могли бы написать:
type
TFoo = class
constructor Create; virtual;
end;
TBar = class(TFoo);
TFooClass = class of TFoo;
var
MyClass: TFooClass;
...
MyClass := TFoo;
result := MyClass.Create;//creates a TFoo;
MyClass := TBar;
result := MyClass.Create;//creates a TBar;