Free Pascal泛型

 DelphiXE2的泛型竟然无法支持加减乘除运算,太让人恼火了.感觉这方面是完全模拟C#的泛型实现的,可是却忘记了一件事情,C#中所有类型都是类,实现了一些公共的接口,而在Delphi中基本的类型确是原生的,本想用DelphiXE2翻译一个C++的模板库.后来发现行不通了,最基本的运算都做不了,里面有个比较大小的运算实现起来也非常复杂.网上搜索了一下Delphi的小弟FPC,其泛型竟然支持直接做运算.让Delphi情何以堪.

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TXX }

  generic TXX<T> = class
    function Double(A: T): T;
  end;

  TXX_Integer = specialize TXX<Integer>;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  o: TXX_Integer;
begin
  o := TXX_Integer.Create;
  ShowMessage(IntToStr(o.Double(10)));
end;

{$R *.lfm}

{ TXX }

function TXX.Double(A: T): T;
begin
  Result := A + A;
end;

end. 

最近突然想到C#中提到泛型与模板的区别,这样实现泛型是为了防止代码大量复制,当然功能上也就大打折扣了.要实现C++的模板功能,只能模仿DGL的方式了.将公共代码部分抽取到inc文件中,将变量类型作为替换部分即可实现.不过最终模板会为每个子类型维护一份代码拷贝.FreePascal应该也是这种原理吧.

你可能感兴趣的:(function,C#,Integer,button,Delphi,pascal)