两个不同子类型的相同记录助手继承

时间:2016-07-21 14:45:00

标签: delphi record helpers

如果一个类型声明包含两个从相同内部类型派生的子类型,那么我们如何为每个子类型提供不同的记录助手呢?

示例:

type
  SingleA = Single;
  SingleB = Single;

  _SingleA = record helper for SingleA
    procedure DoThingsToA;  
  end;

  _SingleB = record helper for SingleB
    procedure DoThingsToB;  
  end;

如果我声明一个类型为SingleA的var,我总是从类型SingleB获得帮助器,我知道如果我们覆盖相同的内部类型,这是正常的行为,但为什么它会发生在不同的类型?

任何帮助都非常感谢...

提前致谢。

2 个答案:

答案 0 :(得分:7)

您不是在这里声明子类型。这段代码:

type
  SingleA = Single;
  SingleB = Single;

仅仅声明别名,而不是类型。因此,SingleASingleB实际上是同一类型Single

这在此解释:

Type Compatibility and Identity (Delphi)

  

当使用另一个类型标识符声明一个类型标识符时,它们没有限定条件,它们表示相同的类型。因此,鉴于声明:

type
  T1 = Integer;
  T2 = T1;
  T3 = Integer;
  T4 = T2;
     

T1T2T3T4Integer都表示相同的类型。要创建不同的类型,请在声明中重复单词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类型。