当前位置: 代码迷 >> Delphi >> Delphi的泛型不支持部类推导
  详细解决方案

Delphi的泛型不支持部类推导

热度:9345   发布时间:2013-02-26 00:00:00.0
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.


  相关解决方案