超难问题:如何根据字符串创建类对象

wooden954 2009-10-23 03:58:13
Type
//基类,根据需要继承自TObject或TPersistent或其它基类,没有弄清楚
Base=Class
public
Load();
end;

C1=Class(Base)
public
load();
end;

C2=Class(Base)
public
load();
end;

定义了三个类,其中一个是其它类的基类,我现在需要创建这些类中的对象实例,但具体创建哪个类的实例是根据参数来的。
并且要求创建的对象在使用Load()函数时,调用的是相应类的Load函数,而不是基类的Load函数。

求各达人帮忙给个解
...全文
142 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Munko 2009-12-10
  • 打赏
  • 举报
回复
楼主,你的问题正是我现在面临的,能否指教一二,我QQ是9701226.
Harryfin 2009-10-23
  • 打赏
  • 举报
回复
如果你使用类名来创建的话,祖先必须从TPersistent来继承,不能从TObject继承。
--------------

那就改成TPersistent好了,反正没什么关系的。
liangpei2008 2009-10-23
  • 打赏
  • 举报
回复
不想继承就把子类的inherited去掉呗!
另:你创建抽象类肯定会出错的
wooden954 2009-10-23
  • 打赏
  • 举报
回复
问题已解,谢谢大家
大大怪老张 2009-10-23
  • 打赏
  • 举报
回复
来学习的
wooden954 2009-10-23
  • 打赏
  • 举报
回复
对于1楼的解答问题:由于我的类相对较多,可能需要多达上百个,所以使用类似于
procedure load(Param: integer);
var
AClass: Base;
begin
if Param = 1 then
AClass := C1.Create
else
AClass := C2.Create;
AClass.Load;
end;
这样的函数是比较难的,因为需要判断的太多了

对于2楼的回答,我试了,不知道是不是没有试对,调用的时候还是调用了基类的函数。过程如下:
将基类中Load函数加上virtual关键字,调试发现结果还是使用的基类函数,将基类中加上virtual;abstract;关键字,结果却直接报错了,消息如下:Project Project1.exe raised exception Class EAbstractError with Message 'Abstract Error'.Process Stopped. Use Step orRun To continue.
我的转型代码如下
var
aIns:Base;
begin
aIns:=Base(FindClass('C1').Create);
Base(aIns).ByteCnt;
end;
(RegisterClass我是在单元的initialization段写的)
liangpei2008 2009-10-23
  • 打赏
  • 举报
回复
对于子类为啥不继承TBASE类中的LOAD,那还继承做什么,不清楚LZ的具体需求,不便瞎说!
zshsuming 2009-10-23
  • 打赏
  • 举报
回复
关注,好多星星。。
liangpei2008 2009-10-23
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TBaseClass=class of TBase;
TForm1 = class(TForm)
T1: TButton;
procedure FormCreate(Sender: TObject);
procedure T1Click(Sender: TObject);
private
{ Private declarations }
procedure CreateObjectByName( const ObjectName : string);
public
{ Public declarations }
end;
TBase = class(TPersistent)
public
procedure Load;virtual;
end;

TC1=class(TBase)
public
procedure Load;override;
end;

TC2=class(TBase)
public
procedure Load;override;
end;


var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterClass(TBase);
RegisterClass(TC1);
RegisterClass(TC2);
end;


{ TC2 }

procedure TC2.Load;
begin
inherited;
ShowMessage('TC2.Load');
end;

{ TBase }

procedure TBase.Load;
begin
ShowMessage('TBase.Load');
end;

{ TC1 }

procedure TC1.Load;
begin
inherited;
ShowMessage('TC1.Load');
end;

procedure TForm1.CreateObjectByName(
const ObjectName : string);
var
fc : TBaseClass;
f : TBase;
begin
fc := TBaseClass(FindClass(ObjectName));
f := fc.Create();
f.Load;

end;
procedure TForm1.T1Click(Sender: TObject);
begin
CreateObjectByName('TC2');
end;

end.
火龙岛主 2009-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 harryfin 的回复:]
1、Load做成虚函数
2、RegisterClass
3、FindClass
4、转型成基类来调用
[/Quote]
如果你使用类名来创建的话,祖先必须从TPersistent来继承,不能从TObject继承。
火龙岛主 2009-10-23
  • 打赏
  • 举报
回复
修正

procedure load(Param: integer);
var
AClass: Base;
begin
if Param = 1 then
AClass := C1.Create
else
AClass := C2.Create;
AClass.Load;
if AClass <> nil then FreeAndNil(AClass);
end;
Harryfin 2009-10-23
  • 打赏
  • 举报
回复
1、Load做成虚函数
2、RegisterClass
3、FindClass
4、转型成基类来调用
火龙岛主 2009-10-23
  • 打赏
  • 举报
回复
你的参数是如何确定的,类的实例固定了,那么他所包含的方法也就固定了。
Base=Class
public
Load(); virtual; abstract;
end;

C1=Class(Base)
public
load(); override;
end;

C2=Class(Base)
public
load(); override;
end;

假设你的函数如下
procedure load(Param: integer);
var
AClass: Base;
begin
if Param = 1 then
AClass := C1.Create
else
AClass := C2.Create;
AClass.Load;
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧