我有以下通用记录,它覆盖了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
不可能对记录使用继承。
不可能定义一个包含不同类型的数组(因此泛型)。
不可能覆盖类中的运算符(因此记录)。
到目前为止,我得出的自然结论是通用记录:
仍然需要满足的最后一个难题是在Equal覆盖中进行编译时检查。在哪里可以添加这种约束来解决这个问题?
我希望像这样的东西能够解决问题,但事实并非如此:
aLeft: TpColumn< String >; aRight: String
“运算符等于必须至少包含一个TpColumn
这是我尝试的方法可以实现的吗?如果没有,还有其他方法可以实现吗?