Delphi中的公共成员和已发布的类成员之间有什么区别?

时间:2010-07-01 12:18:52

标签: delphi oop rtti delphi-6

有人可以解释一下Delphi中公共和已发布的班级成员之间有什么区别吗?

我试着看看Delphi的帮助,我理解这些成员具有相同的可见性,但我不太了解它们的区别,何时我应该使用已发布的成员而不是公开成员。

非常感谢。

8 个答案:

答案 0 :(得分:25)

编译器为已发布成员生成RTTI(运行时类型信息)元数据,但不为公共成员生成(默认情况下)。这样做的主要影响是,对象的已发布属性将在设计时出现在Object Inspector中。

我不知道您是否正在编写组件,但如果您这样做,您可能知道通常会发布属性和事件,以便可以使用Object Inspector设置它们。

公共

public
  property MyProperty: integer read FMyProperty write FMyProperty

MyProperty 将无法在对象检查器中显示。

公开

published
  property MyProperty: integer read FMyProperty write FMyProperty

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

答案 1 :(得分:25)

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

答案 2 :(得分:9)

作为旁注,发布了另一件特别的事情:

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

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

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

NamePasswordDecryptPassword()在全球范围内都可见。

答案 3 :(得分:4)

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

在Delphi中查看关于RTTI的here

答案 4 :(得分:4)

似乎已经有很多好的答案,指出了Object INspector,RTTI, 这些都是谜题的一部分。

如果您删除已发布的关键字,整个Delphi RAD工具设计将需要某种方式来指定哪些属性存储在DFM中,在组件属性检查器中进行检查,并且可以在表单中从DFM在运行时重新加载或创建数据模块。

总之,这就是出版物的用途。有趣的是,QT的设计者(最初是TrollTech,后来是诺基亚的一部分,后来仍然转向Digia)必须为他们的C ++ RAD库“QT”模仿这个级别的RTTI,增加一个“已发布”的等价物和一个“财产”等同,而纯C ++仍然缺乏这种基本设施。

答案 5 :(得分:3)

仅为published班级成员生成运行时类型信息(RTTI)。

答案 6 :(得分:3)

在运行时,已发布和公开部分中的条目均可访问

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

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

Object Inspector选择它并使用它来识别要添加到其属性和事件列表的内容。

答案 7 :(得分:3)

除了其他答案:

已发布的属性由流系统自动存储。

例如,如果您有一个TComponent的后代实例并将其写入带有WriteComponent的TStream,则所有(嗯,不是全部,但这是另一个问题)已发布的属性将被写入流中而没有任何内容进一步编码。

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