谈谈在Lazarus使用泛型(二)自定义泛型

如果在fgl单元中定义的泛型不符合您的需要,您可能需要使用底层语言原语从头定义自己的泛型类。

泛型类在类名之前使用关键字generic定义,并在类声明中使用:

type
  generic TList<T> = class
    Items: array of T;
    procedure Add(Value: T);
  end;

通过使用specialize关键字,可以简单地将泛型类、对象、记录、接口或方法专门化为特定类型。
Type  
  TIntegerList = specialize TList<Integer>;
  TPointerList = specialize TList<Pointer>;
  TStringList = specialize TList<string>;

在理论上,泛型类和普通类之间应该没有速度差异
下面是一个如何使用泛型编写函数gmax()的例子。该函数最多包含两个尚未类型化的变量。
注意,虽然这里的函数以类名命名,但从3.1.1开始的FPC版本也支持完全独立的泛型方法。
program UseGenerics;
{$mode objfpc}{$H+}
type
  generic TFakeClass<_GT> = class
    class function gmax(a,b: _GT):_GT;
  end;
  TFakeClassInt = specialize TFakeClass<integer>;
  TFakeClassDouble = specialize TFakeClass<double>;
  class function TFakeClass.gmax(a,b: _GT):_GT;
  begin
    if a > b then 
      result := a
    else 
      result := b;
  end;
begin
    // show max of two integers
  writeln( 'Integer GMax:', TFakeClassInt.gmax( 23, 56 ) );
    // show max of two doubles
  writeln( 'Double GMax:', TFakeClassDouble.gmax( 23.89, 56.5) );
  readln();
end.
 
posted @ 2023-02-16 23:31  仙侣步惊云  阅读(388)  评论(0)    收藏  举报