【问题标题】:same record helper inheritance from two different sub-types从两个不同的子类型继承相同的记录助手
【发布时间】:2016-11-25 05:33:45
【问题描述】:

有一个类型声明,其中两个子类型派生自相同的内部类型,我们如何为每个子类型设置不同的记录助手?

例子:

type
  SingleA = Single;
  SingleB = Single;

  _SingleA = record helper for SingleA
    procedure DoThingsToA;  
  end;

  _SingleB = record helper for SingleB
    procedure DoThingsToB;  
  end;

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

非常感谢任何帮助...

提前致谢。

【问题讨论】:

    标签: delphi record helpers


    【解决方案1】:

    你没有在这里声明子类型。这段代码:

    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
    

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

    【讨论】:

    • 非常感谢 Johan,你说得一清二楚!
    【解决方案2】:

    不幸的是,当你声明

    type
       SingleA = Single;
    

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

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

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

    编辑

    您还可以通过单步执行代码并查看局部变量窗口中 SingleA 或 SingleB 类型的变量的参数类型来查看这一点,敌人实例。你会看到它总是被指定为 Single 类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-05
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2011-09-26
      • 2014-09-12
      • 1970-01-01
      • 2012-03-30
      相关资源
      最近更新 更多