【问题标题】:Private types are visible to everyone?私有类型对所有人可见?
【发布时间】:2016-02-14 21:01:33
【问题描述】:

在程序开发过程中,我无意中注意到类中声明的所有类型都具有全局可见性。

我一直认为它们的可见性仅限于类,除非类型用类类型名称引用,如 TMyClass.TMytype.Value;

我在这里做错了什么吗,如下所示:

unit MyTest;

interface

type TMyTest  = class
    constructor Create;

    strict private
        type TMyType = ( NUL, SLEEP );

end;

implementation

// ...

导致使用此 (MyTest) 单元的其他单元发生冲突。

如果单元有睡眠(100);调用,它会与 TMyTest.TMyType.SLEEP 冲突,防止冲突是我首先将 SLEEP 封装在 class 和 TMyType 中的原因。

对解决方法有什么建议吗?

【问题讨论】:

  • 这确实令人惊讶,但正如大卫在他的回答中提到的那样:它是有意为枚举值而设计的。仅供参考:枚举值的范围冲突多年来一直是 Delphi 中的一个问题。因此,按照惯例,开发人员通常会为枚举值添加前缀。例如。 TMyType = (mtNUL, mtSLEEP);(值得考虑以确保代码样式一致性。)另一个值得一提的解决方法是更普遍的适用性:在标识符发生冲突的情况下,您可以在所需的单元名称前加上前缀来解决冲突。例如。 Windows.Sleep

标签: delphi types visibility private


【解决方案1】:

这实际上是设计使然。您的枚举值具有单位或全局范围。它们不是私有的,因为它们不是班级的一部分。它们的范围在全球范围内。

您可以通过包含 scoped enums 指令来安排枚举值具有本地范围:

{$SCOPEDENUMS ON}

$SCOPEDENUMS 指令启用或禁用在 Delphi 代码中使用范围枚举。更具体地说,$SCOPEDENUMS 仅影响新枚举的定义,并且仅控制将枚举的值符号添加到全局范围。

{$SCOPEDENUMS ON} 状态下,枚举是有作用域的,枚举值不会添加到全局作用域中。要指定作用域枚举的成员,您必须包含枚举的类型。

【讨论】:

  • 也许它应该打印在文档枚举的符号中。类型本身是strict private,但不是值。乍一看并不清楚,更多的是第二或第三:o)
猜你喜欢
  • 2015-09-28
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
相关资源
最近更新 更多