来自两个不同子类型的相同记录助手继承
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。因此,SingleA
和 SingleB
实际上是相同的类型 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
现在您将拥有两种不同的类型,您的记录助手将按预期工作。
具有从同一内部类型派生的两个子类型的类型声明,我们如何才能为每个子类型使用不同的记录助手?
示例:
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。因此,SingleA
和 SingleB
实际上是相同的类型 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
, andInteger
all denote the same type. To create distinct types, repeat the wordtype
in the declaration. For example:type TMyInteger = type Integer;
creates a new type called
TMyInteger
which is not identical toInteger
.
实际上,= 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
现在您将拥有两种不同的类型,您的记录助手将按预期工作。