我有一个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. 创建新的实例对象
- 3. 反射 - 不能创建一个新的对象实例C#
- 4. 在按钮按下时创建一个对象的新实例
- 5. 创建一个类对象框的新实例()
- 6. 如何从其基类的实例创建一个新对象?
- 7. Django 1.9更新模型对象创建一个新对象实例
- 8. 新阵列(_)填充(对象)不创建对象的新实例
- 9. 的Flex对象创建一倍实例
- 10. 创建未知类型的实例
- 11. Delphi - 从另一个对象访问对象实例数据
- 12. System.NullReferenceException:对象未设置为一个对象的一个实例
- 13. 创建对象实例
- 14. 在一个对象的另一个类中创建实例
- 15. 使用类类的一个对象来创建一个新的实例
- 16. 创建一个新对象
- 17. 从实物创建ASMX存根对象的一个实例
- 18. 返回一个对象的新实例
- 19. iTextSharp 7未将对象引用设置为对象的实例
- 20. (Java的新手)实例化未知数量的对象
- 21. 创建一个对象[多个相同的实例]
- 22. 如何在Clojure中创建一个“对象”的多个实例?
- 23. Automapper创建一个对象的两个实例
- 24. 如何创建“未知”类的对象?
- 25. 在运行时创建未知通用类Type对象的实例?
- 26. 的ConnectionString:对象引用未设置为一个对象实例
- 27. 是否为每个实例重新创建对象属性?
- 28. 试图为每个对象实例创建一个按钮
- 29. 从类创建对象返回另一个类的实例
- 30. 我如何获得在php中创建另一个对象实例的实例?
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