类名称也是一个指针,可以通过名称保存到list,然后通过list得到类名称类创建对象 。但是这个不能执行TClassBase 的create函数,可以通过NewInstance先分配内存,在通过TClassBase(ccc);aaaa.Create;来执行类的初始化函数
TClassBase = class(TPersistent)
private{ Private declarations }
protected
function SelfObj: TClassBase; virtual;
procedure ShowMsg; virtual;
public
{ Public declarations }
constructor Create;
end;
TClassA = class(TClassBase)
private
{ Private declarations }
protected
procedure ShowMsg; override;
public
{ Public declarations }
end;
TClassB = class(TClassBase)
private
{ Private declarations }
protected
procedure ShowMsg; override;
public
{ Public declarations }
end;
TClassManage = class(TObject)
private
{ Private declarations }
FClassList: TList;
protected
public
{ Public declarations }
constructor Create;
destructor Destroy; override;
procedure addClass(aItem: Pointer);
function GetClasstest(AClassName: string): TPersistentClass;
end;
procedure TClassManage.addClass(aItem: Pointer);
begin
FClassList.Add(aItem);
end;
constructor TClassManage.Create;
begin
FClassList := TList.Create;
end;
destructor TClassManage.Destroy;
begin
FClassList.Free;
inherited;
end;
function TClassManage.GetClasstest(AClassName: string): TPersistentClass;
var
i: Integer;
aClass: TPersistentClass;
begin
for I := 0 to FClassList.Count - 1 do
begin
aClass := FClassList[I];
if aClass.ClassNameIs(AClassName) then
begin
Result := aClass;
Exit;
end;
end;
end;
{ TClassBase }
constructor TClassBase.Create;
begin
end;
function TClassBase.SelfObj: TClassBase;
begin
Result := Self;
end;
procedure TClassBase.ShowMsg;
begin
ShowMessage('TClassBase.ShowMsg');
end;
{ TClassA }
procedure TClassA.ShowMsg;begin
inherited;
ShowMessage('TClassA.ShowMsg');
end;
{ TClassB }
procedure TClassB.ShowMsg;
begin
inherited;
ShowMessage('TClassB.ShowMsg');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FMASG := TClassManage.Create;
FMASG.addClass(TClassA);
FMASG.addClass(TClassB);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FMASG.Free;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
aaaa: TClassBase;
ccc: TPersistent;
begin
ccc := (FMASG.GetClasstest('TClassA')).Create;//不会执行TClassBase的create函数
aaaa := TClassBase(ccc);
aaaa.ShowMsg;
ShowMessage(aaaa.SelfObj.ClassName);
ccc.Free;
ccc := (FMASG.GetClasstest('TClassB')).Create;
aaaa := TClassBase(ccc);
aaaa.ShowMsg;
ShowMessage(aaaa.SelfObj.ClassName);
ccc.Free;
end;