2011-05-25 50 views
2

我想在delphi下创建一个名为TRange的泛型类。这个想法是,它可以是一个整数范围或一系列单个或双等...德尔斐泛型类型 - 特异性?

TRange对象包含T类型的一些变量(maxValue,minValue,idealValue等)。 TRange包含一个函数,用于将它们转换为字符串。但是,由于Delphi是强类型语言,因此我需要指定“如何”将不同变量转换为字符串。

我可以使用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) 

然而,编译器告诉我:“运营商并不适用于这一运算对象类型”。

所以,我想我的问题是:

有没有办法给特异性通用类???

+0

当然AbsMin是T型的;)。 – Alexandre 2011-05-25 14:11:20

+0

“整数”和“单个”标签不是非常有用的恕我直言。 – jpfollenius 2011-05-25 16:38:58

回答

6

编译器错误来自您不能使用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);