【问题标题】:Delphi Generic Types - Specificity?Delphi 泛型类型 - 特异性?
【发布时间】:2011-05-25 14:10:02
【问题描述】:

我正在尝试在 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)

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

所以,我想我的问题是:

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

【问题讨论】:

  • 当然 AbsMin 属于 T 型 ;)。
  • IntegerSingle 标签不是很有用恕我直言。

标签: delphi generics integer


【解决方案1】:

编译器错误源于您不能使用as 运算符转换为基本类型,例如SingleInteger。为此使用硬演员:Single(AbsMin)

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

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

如果你真的需要这个,你可以引入一个界面

IValueStringConverter <T> = interface
  function ToString(Value : T) : String;
end;

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

constructor TRange <T>.Create(Converter : IValueStringConverter <T>);
begin
FConverter := Converter;
end;

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

Str := FConverter.ToString(AbsMin);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多