Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Oop_Rtti_Delphi 6 - Fatal编程技术网

什么';Delphi中公开和公开的类成员之间有什么区别?

什么';Delphi中公开和公开的类成员之间有什么区别?,delphi,oop,rtti,delphi-6,Delphi,Oop,Rtti,Delphi 6,请有人给我解释一下Delphi中公开和公开的班级成员有什么区别 我试图查看Delphi帮助,我知道这些成员具有相同的可见性,但我不太清楚它们之间的区别,以及何时应该使用已发布的成员而不是公共成员 非常感谢。编译器为已发布的成员生成RTTI(运行时类型信息)元数据,但不为公共成员生成(默认情况下)。这样做的主要效果是,对象的已发布特性将在设计时显示在对象检查器中 我不知道您是否正在编写组件,但如果您正在编写组件,您可能知道属性和事件通常是发布的,因此可以使用对象检查器设置它们 公开的 MyProp

请有人给我解释一下Delphi中公开和公开的班级成员有什么区别

我试图查看Delphi帮助,我知道这些成员具有相同的可见性,但我不太清楚它们之间的区别,以及何时应该使用已发布的成员而不是公共成员


非常感谢。

编译器为已发布的成员生成RTTI(运行时类型信息)元数据,但不为公共成员生成(默认情况下)。这样做的主要效果是,对象的已发布特性将在设计时显示在对象检查器中

我不知道您是否正在编写组件,但如果您正在编写组件,您可能知道属性和事件通常是发布的,因此可以使用对象检查器设置它们

公开的
MyProperty
将在对象检查器中不可见

出版
MyProperty
将在对象检查器中可见。

发布的属性将导出运行时类型信息(RTTI)


查看Delphi中的RTTI

运行时类型信息(RTTI)仅为
已发布的
类成员生成。

公共属性和已发布的属性具有相同的可见性,如您所述。发布的属性包含在RTTI中,公共属性不包含在RTTI中。

在运行时,发布和公共部分中的条目同样可以访问

它们之间的主要区别在于组件的已发布项在设计时出现在对象检查器中。

这是因为,对于已发布的部分中的字段,RTTI是自动生成的


“对象检查器”会将其选中,并使用它来确定要添加到其属性和事件列表中的内容。

作为旁注,published的另一个特殊功能是:

类成员的默认可见性已发布,因此请检查不安全的代码,如:

  TTopSecret = class(TObject)
    Name: string;
    Password: string;

    function DecryptPassword(const AValue): string;  
  public
    constructor Create(const AName, AEncryptedPassword: string);
  end; 

Name
Password
DecryptPassword()
在“全球”可见。

除了其他答案外:

发布的属性由流媒体系统自动存储

例如,如果您有一个TComponent的子实例,并使用WriteComponent将其写入TStream,则所有(不是全部,但这是另一个问题)已发布的属性都将写入流,而无需进行任何进一步的编码


当然,流媒体系统只能做到这一点,因为RTTI可用于那些已发布的属性。

似乎已经有很多好的答案,指出对象检查器RTTI, 等等。这些都是拼图的一部分

如果去掉published关键字,整个Delphi-RAD工具设计将需要某种方式来指定哪些属性存储在DFM中,哪些属性在组件属性检查器中检查,哪些属性可以在创建表单或数据模块时在运行时从DFM重新加载


总之,这就是出版的目的。有趣的是,QT的设计者(最初是TROLLTECK,后来是诺基亚的一部分,后来仍然被纺成Digia)不得不模仿C++的RAD库“QT”的RTTI级别,添加了一个“发布”的等价物和一个“属性”等价物,而纯C++仍然缺少这个基本的工具。它出现在对象检查器中的根本原因是发布的成员存在RTTI元数据。换句话说,你所看到的是潜在差异的一种影响。一个更正确的答案是,发布的成员有RTTI,而公共成员没有。@Lasse V.Karlsen:是的,你说得对。但是,由于这可能是最明显的差异(?),而且还没有其他答案指出这一点,我现在将不删除我的答案。对不起,我没有说得足够清楚:)我同意,这是差异最明显的影响。我的观点是,您应该指出根本的区别是RTTI,而不是删除您的答案(即使其他答案现在指向RTTI)然而,我认为值得指出的是,如果你问一个关于公开方法和公开方法之间的区别的问题,那么术语RTTI可能对你也没有任何意义。安德烈亚斯提供了一个非常有用的答案,但方法不同。这个答案中没有提到。至少这一条:“只能将一个构造函数声明为已发布-重载版本必须定义为public。”此外,发布的属性不能返回数组。除非指定了{$M+}/{$TYPEINFO ON},否则在这种情况下,public成员将具有RTTI。如果这是真的,@Mjustin,那么这是对早期Delphi版本的更改。过去的情况是,如果没有$M+,公共和出版是等价的。就是,除非$M+生效,否则发布的部分不会生成RTTI。RTTI代表运行时类型信息或Delphi编译器在设计时使对象检查器和Delphi IDE的其他部分在设计时正确工作所需的信息。完整性:Delphi 2010也可以为公共成员生成RTTI,事实上,可以为所有成员生成RTTI,包括受保护和私有。但是发布的成员仍然是由对象检查器“发布”并由自动流机制使用的成员。免费的Pascal是否像Delphi2010一样工作?与中一样,它是否为公共属性生成RTTI?为简单起见不使用published安全吗?这可能是最重要的区别!RTTI只是实现这一目标所需的“粘合剂”。
published
  property MyProperty: integer read FMyProperty write FMyProperty
  TTopSecret = class(TObject)
    Name: string;
    Password: string;

    function DecryptPassword(const AValue): string;  
  public
    constructor Create(const AName, AEncryptedPassword: string);
  end;