谈谈在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.
浙公网安备 33010602011771号