delphi 泛型之 动态创建类的对象

delphi 泛型使用很是折腾,和c++的差得太远。特别是类模板的使用,创建很是麻烦,还好可以变通的写出来。

以下举个例子,如何使用类模板。

unit test1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, 
Vcl.Dialogs, Generics.Collections, Vcl.StdCtrls, Vcl.Buttons;

type
  TForm4 = class(TForm)
    btn1: TBitBtn;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


  TValue = class  //基类
  public
    function Name: string; virtual;  //虚方法
  end;

  TValue1= class(TValue)
  public
    function Name: string; override;  //覆盖基类虚方法
  end;

  TTest = class
  public
    procedure Method<T: TValue>;  //测试方法1,用基类做模板类型,可以传入任意子类
    procedure Method2<T: class>;  //测试方法2,用class关键字,可以传入任意类
  end;


var
  Form4: TForm4;

implementation

{$R *.dfm}


{ TValue }


function TValue.Name: string;
begin
  Result:= 'value_base';
end;


{ TValue1 }


function TValue1.Name: string;
begin
  Result:= '1_' + inherited Name; //'value_1';

end;


{ TTest }

procedure TTest.Method2<T>;
var
  value: T;
begin
  value:= T(TClass(T).Create);  //用tclass把类型强转,然后才能调用到Create方法,
                                //最后用T强转回来,是不是很折腾,而不能直接写T.Create ???

  ShowMessage((value as TValue).Name); //这里用as强转为某个类,才能调用到类的方法
  value.free;
end;

procedure TTest.Method<T>;
var
  value: T;
begin
  value:= T(TClass(T).Create);
  ShowMessage(value.name);  //这里由于有类型定义,可以直接调用,不用as强转
  value.free;
end;



procedure TForm4.btn1Click(Sender: TObject);
var
  t1: TTest;
begin
  t1:= TTest.Create;
  t1.Method<TValue>;  //value_base
  t1.Method<Tvalue1>;  //1_value_base
  t1.Method<Tvalue>;  //value_base
  t1.Method2<TValue1>;  //1_value_base
end;
发布了19 篇原创文章 · 获赞 10 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ltk80/article/details/103421918
今日推荐