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;