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

same record helper inheritance from two different sub-types

具有从同一内部类型派生的两个子类型的类型声明,我们如何才能为每个子类型使用不同的记录助手?

示例:

type
  SingleA = Single;
  SingleB = Single;

  _SingleA = record helper for SingleA
    procedure DoThingsToA;  
  end;

  _SingleB = record helper for SingleB
    procedure DoThingsToB;  
  end;

如果我声明一个类型为 SingleA 的 var,我总是从类型 SingleB 中获取助手,我知道如果我们重写相同的内部类型这是正常行为,但为什么不同类型会发生这种情况?

非常感谢任何帮助...

提前致谢。

不幸的是,当你声明

type
   SingleA = Single;

Delphi 将此视为别名而不是派生类型。

所以它认为,在您的情况下,SingleA、SingleB 和 Single 都是相同的。 (您可以通过声明一个参数类型为 SingleA 的函数并尝试将 SingleB 参数传递给它来看到这一点)。

因此,遵循任何一种类型只能有一个助手的规则,而 SingleB 的助手是最后定义的,正如您评论的那样,这种行为是可以预料的。

编辑

您还可以通过单步执行代码并查看局部变量 window 中 SingleA 或 SingleB 类型变量的参数类型来查看这一点,foe 实例。您会看到它始终指定为 Single 类型。

您没有在这里声明子类型。此代码:

type
  SingleA = Single;
  SingleB = Single;

只是声明 aliases,而不是 types。因此,SingleASingleB 实际上是相同的类型 Single.

这里有解释:

Type Compatibility and Identity (Delphi)

When one type identifier is declared using another type identifier, without qualification, they denote the same type. Thus, given the declarations:

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

T1, T2, T3, T4, and Integer all denote the same type. To create distinct types, repeat the word type in the declaration. For example:

type TMyInteger = type Integer;

creates a new type called TMyInteger which is not identical to 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

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