用过C++的模板后,刚接触Delphi的泛型,好不习惯。
TMyClass<T> = class
FT : T;
procedure DoIt;
end;
//全局函数,全局函数也不支持泛型……
procedure GDoIt(var T : Integer); overload;
procedure GDoIt(var T : Single); overload;
procedure TMyClass<T>.DoIt;
begin
GDoIt(FT); //居然不允许,没有类型推导
end;
var
v : TMyClass<Integer>;
...
v.DoIt;
没有弄明白Delphi中泛型的一些机制,总是套用C++,
这个是典型的类型推导,居然不支持,让我很觉得意外。
不过Delphi中的泛型中有约束的概念,要比C++中的明确很多。
由于约束的描述太过复杂,就用了record,class和Interface,
用Interface和class来描述约束,还是很好的,
但是用record来描述,除了知道是一个值类型之外,连成员函数都不知道。
------解决方案--------------------------------------------------------
//你是冲着C++就去了 哈哈
unit Unit11;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Generics.Collections, StdCtrls;
type
TForm11 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
procedure fun<T>(Value : T);
public
{ Public declarations }
end;
TMyClass<T> = class
private
FT : T;
public
procedure DoIt(Value : T);
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
procedure TForm11.btn1Click(Sender: TObject);
var
MyClass1 : TMyClass<string>;
MyClass2 : TMyClass<integer>;
begin
fun<Integer>(123);
fun<string>('abc');
MyClass1 := TMyClass<string>.Create;
try
MyClass1.DoIt('abc');
finally
MyClass1.Free;
end;
MyClass2 := TMyClass<integer>.Create;
try
MyClass2.DoIt(123);
finally
MyClass2.Free;
end;
end;
procedure TForm11.fun<T>(Value: T);
var
FT : T;
begin
FT := Value;
end;
{ TMyClass<T> }
procedure TMyClass<T>.DoIt(Value: T);
begin
FT := Value;
end;
end.