Delphi中的泛型简单类型

6

如何创建一个只包含基本类型的通用类?

TField<T: xxx> = class  
private
    FValue: T;  
public  
    property Value: T read FValue write FValue;  
end;

我不需要接口、类等,我只需要布尔值、整数、浮点数等...

或者还有其他方法可以做到这一点吗?

谢谢

4个回答

7
您可以使用“record”关键字来限制值类型(而非引用类型):
TField<T: record> = class   
private 
    FValue: T;   
public   
    property Value: T read FValue write FValue;   
end;

1
如果提到“record”关键字,那么这是Delphi语言中最直观的关键字用法之一,值得加1分。 - Jeroen Wiert Pluimers
1
请注意,即使“record”关键字将其限制为值类型,您几乎无法使用这些值。只需查看Allen Bauer在此文章中实现Nullable<T>的Equal和NotEqual运算符所需经历的困难:http://blogs.embarcadero.com/abauer/2008/09/18/38869 - Jeroen Wiert Pluimers
2
有趣的是,你不能做以下的事情: -<T: boolean> //即使它很傻... -<T: TObject> //你可以放置任何继承自TObject的类,但不能是TObject本身如果我想为无参数构造函数对象创建一个通用对象池呢?TObjectPool<T: TObject, constructor>我会得到“E2510 类型'TObject'不是有效的约束”。 - user248796
Leffy:确实很奇怪。我想限制为所有可创建类型,但遇到了同样的问题。 - Marco van de Voort
3
找到了,使用“class”代替“tobject”。 - Marco van de Voort

1

我不确定我是否理解您的问题,但如果您想要一个可以保存不同基本数据类型的变量,您可能需要查看 Variant数据类型。

您不需要泛型;-)


1
Delphi 2010在其RTTI改进的一部分中引入了Rtti单元中的TValue,它本质上是一个更轻量级的Variant。假设你正在使用D2010,它可能会更适合你的目的。 - Michael Madsen
实际上,一些变量转换取决于运行时环境(区域设置等),因此它们可能会给您带来一些非常意外的结果。 - Jeroen Wiert Pluimers
@Michael:因为提到TValue,+1评论。 - Jeroen Wiert Pluimers
是的,我正在使用D2010,我没有任何特定的目的,我只是尽可能深入地使用泛型来玩耍,以发挥我的大脑。 - user248796

1
根据Craig Stuntz' blog所述:

Delphi/Win32类型系统没有根(内置的简单类型、记录和类没有共同的祖先),原始类型不能/不实现接口

因此,很可能无法将通用类限制为原始类型(与C#不同,后者允许“where T: struct”)。

-1:你可以使用DanB提到的“记录”限制。 - Jeroen Wiert Pluimers

0

如果你想限制可以用于泛型的类型,那么你只需在创建时检查有效类型即可吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接