我有一個TObject引用了一個未知類的實例。我如何調用這個未知類的構造函數來創建它的另一個實例?我知道德爾福有RTTI,但不清楚如何使用它。Delphi 7:創建一個未知對象的新實例
4
A
回答
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
相關問題
- 1. 創建一個未知類型的對象的實例和TryUpdateModel
- 2. mysqli_fetch_object時創建新的對象實例
- 3. 創建新的實例對象
- 4. 從未知類型的數組中創建對象的新實例
- 5. 反射 - 不能創建一個新的對象實例C#
- 6. 如何從其基類的實例創建一個新對象?
- 7. 創建一個類對象框的新實例()
- 8. 在按鈕按下時創建一個對象的新實例
- 9. 創建一個對象的新實例,或修改現有的實例?
- 10. Django 1.9更新模型對象創建一個新對象實例
- 11. 新陣列(_)填充(對象)不創建對象的新實例
- 12. 對象引用未設置到對象的實例,儘管創建一個新的對象
- 13. 使用新詞創建對象實例
- 14. 的Flex對象創建一倍實例
- 15. 創建未知類型的實例
- 16. Delphi - 從另一個對象訪問對象實例數據
- 17. 創建對象實例
- 18. System.NullReferenceException:對象未設置爲一個對象的一個實例
- 19. 無法實例化對象:只創建第一個對象
- 20. 在一個對象的另一個類中創建實例
- 21. 使用類類的一個對象來創建一個新的實例
- 22. 創建一個新對象
- 23. 在注入對象時強制創建對象的新實例
- 24. 從實物創建ASMX存根對象的一個實例
- 25. 返回一個對象的新實例
- 26. @GeneratedValue當創建一個新的實例
- 27. 創建一個新的類實例
- 28. CRM創建一個CrmConnection的新實例
- 29. 創建一個新的weka實例
- 30. (Java的新手)實例化未知數量的對象
http://stackoverflow.com/q/3068775 – 2014-11-06 17:55:49
@Ken:這是爲Delphi 7,其不支持擴展RTTI。這是在D2010中添加的。 – 2014-11-06 18:00:11
簡單的答案是你不能這樣做。 – 2014-11-06 19:05:43