2014-11-06 101 views
4

我有一個TObject引用了一個未知類的實例。我如何調用這個未知類的構造函數來創建它的另一個實例?我知道德爾福有RTTI,但不清楚如何使用它。Delphi 7:創建一個未知對象的新實例

+1

http://stackoverflow.com/q/3068775 – 2014-11-06 17:55:49

+1

@Ken:這是爲Delphi 7,其不支持擴展RTTI。這是在D2010中添加的。 – 2014-11-06 18:00:11

+0

簡單的答案是你不能這樣做。 – 2014-11-06 19:05:43

回答

8

您不能構造未知類型的對象。編譯器必須在編譯時知道正確的類類型,才能生成正確的代碼。如果構造函數需要參數呢?多少?什麼數據類型?他們是通過堆棧還是註冊?這些信息很重要。這就是說,如果有問題的類都是從具有虛擬構造函數的公共基類派生的,則THEN和ONLY THEN可以構造這樣的對象。您可以使用TObject.ClassType()方法獲取對現有對象類類型的引用,並將其類型轉換爲基類類型,然後調用構造函數。例如:

type 
    TBase = class 
    public 
    constructor Create(params); virtual; 
    end; 

    TBaseClass = class of TBase; 

    TDerived1 = class(TBase) 
    public 
    constructor Create(params); override; 
    end; 

    TDerived2 = class(TBase) 
    public 
    constructor Create(params); override; 
    end; 

    ... 

var 
    NewObj: TBase; 
begin 
    if SomeObj is TBase then 
    NewObj := TBaseClass(SomeObj.ClassType).Create(params); 
end; 
+2

值得一提的是,這是'TComponent'工作的基本方式。只要你有ClassType(比如X),你就可以調用'TComponentClass(X).Create(...)'。 DFM流式傳輸通過查找在DFM中爲特定類名稱註冊的ClassType並按以上實例化來工作。 – 2014-11-07 16:09:22

相關問題