如果一个类型声明包含两个从相同内部类型派生的子类型,那么我们如何为每个子类型提供不同的记录助手呢?
示例:
type
SingleA = Single;
SingleB = Single;
_SingleA = record helper for SingleA
procedure DoThingsToA;
end;
_SingleB = record helper for SingleB
procedure DoThingsToB;
end;
如果我声明一个类型为SingleA的var,我总是从类型SingleB获得帮助器,我知道如果我们覆盖相同的内部类型,这是正常的行为,但为什么它会发生在不同的类型?
任何帮助都非常感谢...
提前致谢。
答案 0 :(得分:7)
您不是在这里声明子类型。这段代码:
type
SingleA = Single;
SingleB = Single;
仅仅声明别名,而不是类型。因此,SingleA
和SingleB
实际上是同一类型Single
。
这在此解释:
Type Compatibility and Identity (Delphi)
当使用另一个类型标识符声明一个类型标识符时,它们没有限定条件,它们表示相同的类型。因此,鉴于声明:
type T1 = Integer; T2 = T1; T3 = Integer; T4 = T2;
T1
,T2
,T3
,T4
和Integer
都表示相同的类型。要创建不同的类型,请在声明中重复单词type
。例如:type TMyInteger = type Integer;
创建一个名为
TMyInteger
的新类型,它与Integer
不同。
实际上,= type x
构造为类型创建了新的类型信息,以便使用
TypeInfo(SingleA) <> TypeInfo(SingleB)
。
在原始代码中,您只是为同一类型Single
声明了两个别名。
对于任何给定类型(及其别名),您可以only have one type helper in scope,因此在原始代码中,record helper for SingleB
会隐藏record helper for SingleA
。
通过将别名升级为自己的类型,可以避免此问题:
type
SingleA = type Single;
SingleB = type Single; <<-- the type keyword makes SingleB distinct from SingleA
现在您将拥有两种不同的类型,并且您的记录助手将按预期工作。
答案 1 :(得分:1)
不幸的是,当你宣布
时type
SingleA = Single;
Delphi将此视为别名而非派生类型。
因此,在您的情况下,它看到SingleA,SingleB和Single都是相同的。 (您可以通过声明一个类型为SingleA的参数并尝试将SingleB参数传递给它的函数来看到这一点)。
因此遵循以下规则:对于任何一种类型,只能有一个帮助器,而SingleB的帮助器是最后定义的,当您发表评论时,行为是可以预期的。
您还可以通过单步执行代码并在局部变量窗口foe实例中查看SingleA或SingleB类型变量的参数类型来查看此内容。您将看到它始终指定为Single类型。