Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 私有类型对每个人都可见吗?_Delphi_Types_Visibility_Private - Fatal编程技术网

Delphi 私有类型对每个人都可见吗?

Delphi 私有类型对每个人都可见吗?,delphi,types,visibility,private,Delphi,Types,Visibility,Private,在程序开发期间,我无意中注意到类中声明的所有类型都具有全局可见性 我一直认为它们的可见性仅限于类,除非使用类类型名称(如TMyClass.TMytype.Value)引用类型 我在这里真的做错了什么吗,就像下面这样的结构: unit MyTest; interface type TMyTest = class constructor Create; strict private type TMyType = ( NUL, SLEEP ); end; i

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

我一直认为它们的可见性仅限于类,除非使用类类型名称(如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封装在类和TMyType中的原因


有没有关于解决办法的建议?

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

通过包含以下指令,可以安排枚举值具有本地范围:

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

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


也许它应该打印在docs枚举的值符号中。类型本身是
严格私有的
,但不是值。这一点乍一看并不清楚,更多的是在第二个或第三个方面:o)这确实令人惊讶,但正如David在回答中提到的:这是有意为枚举值设计的。仅供参考:枚举值的范围冲突多年来一直是Delphi中的一个问题。所以按照惯例,开发人员通常在枚举值前加前缀。例如
TMyType=(mtNUL,mtSLEEP)(值得考虑以确保代码样式的一致性。)另一个更具普遍适用性的解决方案值得一提:在标识符冲突的地方,您可以为所需的单元名称添加前缀以解决冲突。例如
Windows.Sleep