有个小问题想请教各位高手:类名(并非对象)可否当作参数传递给过程或函数?(50分)

  • 主题发起人 主题发起人 Blueman
  • 开始时间 开始时间
B

Blueman

Unregistered / Unconfirmed
GUEST, unregistred user!
比如有两个做好了类TFrame1,TFrame2。假若我要做个过程,用类名作参数,在过程中实现类
实例的建立,请问怎么样实现?
请问以下代码能实现吗?这是否用到对象多态性方面的技术?

procedure CreateObject (ClassName:TFrame);
Begin
ClassName.Create(nil);
End;

procedure Main ();
Begin
CreateObject(TFrame1);
CreateObject(TFrame2);
End;

因是初来大富翁论坛,所以银两不多,只能奉上50两,请各路高手见谅!


 
错了,创建是这样创建的
TFrame1:=TFrame.Create
//实体:=类.创建
参数是传实体,你还没有创建,传什么啊。

 
Blueman,你的方法可以,但是你要保存create的结果,否则如何释放而造成内存泄漏,因此可以
这么写:
with ClassName.Create(nil) do begin
......
finally
free
//记住释放
end
 
先谢过 xueminliu 的建议!

不过问题并未能解决,系统编译不能通过。
procedure CreateObject (ClassName:TFrame)
// 形参为对象
Begin
ClassName.Create(nil);
End;

procedure Main ();
Begin
CreateObject(TFrame1)
// 实参为类名,编译时会说:
// Incompatible types: 'TFrame' and 'Class reference'
CreateObject(TFrame2);
End;
从编译报警中可以看出,调用过程或函数时系统只认为参数类型不符,而未讲类名
不可作参数。我想,语言编译程序在编译时应该能解决这个问题。所以,我就只想
问:在过程或函数声明时,如何将一个类名声明为形参?C++中有解决的方法吗?
难道真像tinytao讲的那样?
 
定义一个类的引用
如:
Type
TFrameClass = class of TFrame;
然后用它做你的参数类型
procedure CreateObject (ClassName:TFrameClass)

 
答案就是 Kylix㊣ 所说的。
这是 Object Pascal 语言 Run Time Type Info (RTTI) 的应用,RTTI 技术允许在运行
时刻获取 class 的类型信息,Is 和 As 操作符也是利用了这一手段。
 
同意Kylix㊣,其实你打开任何一个dpr文件,Application.CreateForm(...)就是一个好例子
 
谢谢!问题已解决!
 
那快结束问题呀,呵呵……
 
实际上更简单的就是直接传一个字符串(类的名称)过去,通过类的名称去创建类的事例。

type
TFrameClass=Class of TFrame;
procedure CreateFrame(ClassName:string);
var
classN:TFraneClass;
begin
ClassN:=TFrameClass(FindClass(ClassName));
if ClassN<>nil then
with ClassN.create(AOwner) do
....
end;

不过用这种方法时,需先用RegisterClass(es)注册类才可以
 
接受答案了.
 
后退
顶部