读书人

Delphi的泛型不支持部类推导

发布时间: 2013-02-17 10:44:46 作者: rapoo

Delphi的泛型不支持类型推导?
用过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.


读书人网 >.NET

热点推荐