delphi类与对象的转化

类名称也是一个指针,可以通过名称保存到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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值