有兩個物件:TFoo, TFoo2。
還有一個類參考: TFooClass = class of TFoo;
兩者都是TPersistent.
他們有自己的建構式:
type
TFoo = class(TPersistent)
private
FC:Char;
public
constructor Create; virtual;
published
property C:Char read FC write FC;
end;
TFoo2 = class(TFoo)
public
constructor Create; override;
end;
TFooClass = class of TFoo;
...
constructor TFoo.Create;
begin
inherited Create;
C :=' 1';
end;
constructor TFoo2.Create;
begin
inherited Create;
C := '2';
end;
我想TFoo2從一個字串創建一個物件,它實際上是它的類名:'TFoo2'
這是程式,它作業正常:
procedure Conjure(AClassName:string);
var
PClass : TPersistentClass;
p :TPersistent;
begin
PClass := TPersistentClass(FindClass(AClassName))
p := TFooClass(PClass).Create; // <-- here is called appropriate constructor
end;
現在,我想要類似的物件,例如:TBobodo, TBobodo2。
當然還有一個類參考: TBobodoClass = class of TBobodo;
等等...
現在,如何將類參考作為引數傳遞給程序,以確保呼叫正確的建構式?
procedure Conjure(AClassName:string; ACLSREF: ???? ); // <-- something like that
var
PClass : TPersistentClass;
p :TPersistent;
begin
PClass := TPersistentClass(FindClass(AClassName))
p := ACLSREF(PClass).Create; // <-- something like that
end;
是否可以?
uj5u.com熱心網友回復:
在 Delphi 7 中沒有辦法做你想做的事情。元類參考必須在呼叫站點的編譯時顯式,而不是在運行時處理。
在 Delphi 2009 及更高版本中,您可以 1使用Generics做一些事情,例如:
1:我自己還沒有嘗試過。
type
TConjureHelper = class
public
class procedure Conjure<TClassType>(const AClassName: string);
end;
class procedure TConjureHelper.Conjure<TClassType>(const AClassName: string);
var
PClass : TPersistentClass;
p : TPersistent;
begin
PClass := TPersistentClass(FindClass(AClassName));
p := TClassType(PClass).Create;
...
end;
...
TConjureHelper.Conjure<TFooClass>('TFoo2');
TConjureHelper.Conjure<TBobodoClass>('TBobodo2');
...
但是 Delphi 7 肯定不支持泛型。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315587.html
上一篇:DelphiWin32TXMLDocument無法從執行緒實體化和使用?[復制]
下一篇:為什么FileAge回傳意外值?
