在Delphi中使用泛型类型的算术运算
我是Delphi的新手.对于我公司要求的项目,我需要将现有C类中的一些代码翻译成Delphi.其中一些类是模板,例如:
template <class T> struct APoint { T m_X; T m_Y; virtual void Add(T value); }; template <class T> void APoint<T>::Add(T value) { m_X += value; m_Y += value; } 我用它,例如用这个代码 APoint<float> pt; pt.m_X = 2.0f; pt.m_Y = 4.0f; pt.Add(5.0f); 这很有效. 现在我需要为Delphi编写等效的代码.我尝试编写一个Delphi Generic类,基于上面的C代码: APoint<T> = record m_X: T; m_Y: T; procedure Add(value: T); end; procedure APoint<T>.Add(value: T); begin m_X := m_X + value; m_Y := m_Y + value; end; 但是这段代码无法编译.我收到此错误:
AFAIK这个代码应该可行,我不明白它有什么问题.那么任何人都可以向我解释: >为什么这样的代码不能在Delphi中编译? 2016年10月17日编辑 感谢所有的答复.因此,如果我理解正确,就无法创建类似c的样式模板,因为Delphi强加了c中不存在的几个约束. 基于此,我搜索了一个解决方法,以达到我想要的目标.我找到了以下解决方案: IPoint<T> = interface procedure Add(value: T); end; APoint<T> = class(TInterfacedObject,IPoint<T>) m_X: T; m_Y: T; procedure Add(value: T); virtual; abstract; end; APointF = class(APoint<Single>) destructor Destroy; override; procedure Add(value: Single); reintroduce; end; destructor APointF.Destroy; begin inherited Destroy; end; procedure APointF.Add(value: Single); begin m_X := m_X + value; m_Y := m_Y + value; end; 我用它,例如用这个代码 procedure AddPoint; var pt: IPoint<Single>; begin pt := APointF.Create; APointF(pt).m_X := 2.0; APointF(pt).m_Y := 4.0; APointF(pt).Add(5.0); end; 这很有效.但是我发现这种风格有点重,例如使用APointF(pt)的必要性.所以,就上面的代码而言,我的问题是: >这个解决方案是一个好的解决方案(即最好为我想支持的每种类型编写每个记录的版本,例如APointF,APointI,APointD,……) 最后,我在Delphi代码中看到了另一种解决方案,可以通过这种方式实现2种泛型类型的相等比较: function APoint<T>.IsEqual(const other: APoint<T>): Boolean; var comparer: IEqualityComparer<T>; begin Result := (comparer.Equals(m_X,other.m_X) and comparer.Equals(m_Y,other.m_Y)); end; 我试着阅读幕后的代码,但是我发现它非常复杂.所以,我的问题是: >这样的解决方案比上面提出的更好吗? 提前感谢您的回复 问候 解决方法
Delphi Generics与C模板本质上不同,它们更像C#对应物.
在C中,您可以对模板类型执行任何操作,并且在模板实例化时,编译器会检查您在模板中执行的操作是否适用于您正在使用的特定类型.如果没有,您会收到编译器错误. 在Delphi(和许多其他语言)中,您声明一个泛型类型可能提供一些声明性约束,而这些约束 – 基类或接口 – 确定您可以对泛型类型执行的操作.在实例化时,唯一的检查是声明的类型是否适合约束. 可以说,Delphi语言可以为浮点或序数类型添加约束,但这会提供非常有限的灵活性(更改可在通用实例中使用的浮点或整数类型).我个人并不认为这是一个关键特征. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |