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

Ant*_*lix 5 delphi record helpers

具有源自相同内部类型的两个子类型的类型声明,我们如何为每个子类型具有不同的记录助手?

例:

type
  SingleA = Single;
  SingleB = Single;

  _SingleA = record helper for SingleA
    procedure DoThingsToA;  
  end;

  _SingleB = record helper for SingleB
    procedure DoThingsToB;  
  end;
Run Code Online (Sandbox Code Playgroud)

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

任何帮助非常感谢...

提前致谢.

Joh*_*ica 7

您没有在此声明子类型.这段代码:

type
  SingleA = Single;
  SingleB = Single;
Run Code Online (Sandbox Code Playgroud)

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

这在这里解释:

类型兼容性和身份(Delphi)

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

type
  T1 = Integer;
  T2 = T1;
  T3 = Integer;
  T4 = T2;
Run Code Online (Sandbox Code Playgroud)

T1,T2,T3,T4,和Integer所有表示相同的类型.要创建不同的类型,请重复type声明中的单词.例如:

type TMyInteger = type Integer;
Run Code Online (Sandbox Code Playgroud)

创建一个新的类型,称为TMyInteger是不相同的Integer.

实际上,= type x构造为类型创建了新的类型信息
TypeInfo(SingleA) <> TypeInfo(SingleB).

在原始代码中,您只是为同一类型声明了两个别名Single.

对于任何给定类型(及其别名),您只能在范围内有一个类型帮助器,因此在原始代码中record helper for SingleB隐藏了record helper for SingleA.

通过将别名升级到自己的类型,可以避免此问题:

type
  SingleA = type Single;    
  SingleB = type Single;  <<-- the type keyword makes SingleB distinct from SingleA
Run Code Online (Sandbox Code Playgroud)

现在您将拥有两种不同的类型,您的记录助手将按预期工作.