Delphi通用类型 - 特异性?

Ale*_*dre 2 delphi generics integer

我试图在delphi下创建一个名为TRange的泛型类.这个想法是它可以是一个整数范围或一系列单个,或双重等...

TRange对象包含一些类型为T的变量(maxValue,minValue,idealValue等).TRange包含一个函数,用于将它们转换为字符串.但是,由于Delphi是一种强类型语言,我需要指定"How-To"将不同的变量转换为字符串.

我可以使用GetTypeName(TypeInfo(T))获取T类型的typeName.一旦我知道哪种类型是T,我想我可以做类似的事情:

if(className = 'single') then
 result := formatFloat('0.0', self.AbsMin as Single)
 else
 result := intToStr(self.AbsMin as Integer)
Run Code Online (Sandbox Code Playgroud)

但是,编译器告诉我"运算符不适用于此操作数类型".

所以,我想我的问题是:

有没有办法赋予泛型类特异性???

jpf*_*ius 6

编译器错误来自于您无法使用as运算符强制转换为原始类型(如Single或)Integer.使用硬铸造:Single(AbsMin).

有没有办法赋予泛型类特异性???

为什么需要将值转换为字符串?这有点违背泛型类的想法,因为您现在回到实现所有情况的特殊行为.

如果你确实需要这个,你可以介绍一个界面

IValueStringConverter <T> = interface
  function ToString(Value : T) : String;
end;
Run Code Online (Sandbox Code Playgroud)

您可以在TRange类的构造函数中提供转换器并将其存储在字段中:

constructor TRange <T>.Create(Converter : IValueStringConverter <T>);
begin
FConverter := Converter;
end;
Run Code Online (Sandbox Code Playgroud)

现在只需使用类中的转换器进行转换:

Str := FConverter.ToString(AbsMin);
Run Code Online (Sandbox Code Playgroud)