Delphi通用记录,向Equal运算符添加约束

时间:2020-09-20 00:08:37

标签: delphi generics

我有以下通用记录,它覆盖了Equality运算符。 这个想法是要获得一些编译时验证,如下例所示:

TpColumn<T> = record
  class operator Equal (aLeft: TpColumn<T>; aRight: String): TRec;
  class operator Equal (aLeft: TpColumn<T>; aRight: Integer): TRec;
end;

function FormCreate;
var vStrRec: TpColumn<String>;
    vIntRec: TpColumn<Integer>;
begin
  vCond1 := vStrRec = 'hello'; // should accept
  vCond2 := vIntRec = 5;       // should accept

  vCond1 := vStrRec = 5;       // should reject, currently accepted
end;

我可以将TpColumnInt和TpColumnStr定义为不同的类型,每种类型都覆盖其相等性(并且可以工作),但是我想定义一个TpColumn 的数组,而与类型T无关。

不可能对记录使用继承。

不可能定义一个包含不同类型的数组(因此泛型)。

不可能覆盖类中的运算符(因此记录)。

到目前为止,我得出的自然结论是通用记录:

  • 可以将TpColumn 和TpColumn 放在同一数组中。 编辑:我知道我在这个假设中弄错了,所以猜想这种方法将不起作用。
  • 可以重载运算符

仍然需要满足的最后一个难题是在Equal覆盖中进行编译时检查。在哪里可以添加这种约束来解决这个问题?

我希望像这样的东西能够解决问题,但事实并非如此:

aLeft: TpColumn< String >; aRight: String

“运算符等于必须至少包含一个TpColumn 输入参数” –编译器。

这是我尝试的方法可以实现的吗?如果没有,还有其他方法可以实现吗?

0 个答案:

没有答案
相关问题