Type
//基类,根据需要继承自TObject或TPersistent或其它基类,没有弄清楚
Base=Class
public
Load();
end; C1=Class(Base)
public
load();
end;
C2=Class(Base)
public
load();
end;定义了三个类,其中一个是其它类的基类,我现在需要创建这些类中的对象实例,但具体创建哪个类的实例是根据参数来的。
并且要求创建的对象在使用Load()函数时,调用的是相应类的Load函数,而不是基类的Load函数。求各达人帮忙给个解
//基类,根据需要继承自TObject或TPersistent或其它基类,没有弄清楚
Base=Class
public
Load();
end; C1=Class(Base)
public
load();
end;
C2=Class(Base)
public
load();
end;定义了三个类,其中一个是其它类的基类,我现在需要创建这些类中的对象实例,但具体创建哪个类的实例是根据参数来的。
并且要求创建的对象在使用Load()函数时,调用的是相应类的Load函数,而不是基类的Load函数。求各达人帮忙给个解
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;
2、RegisterClass
3、FindClass
4、转型成基类来调用
var
AClass: Base;
begin
if Param = 1 then
AClass := C1.Create
else
AClass := C2.Create;
AClass.Load;
if AClass <> nil then FreeAndNil(AClass);
end;
unit Unit1;interfaceuses
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.
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段写的)
另:你创建抽象类肯定会出错的
--------------那就改成TPersistent好了,反正没什么关系的。