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

Ond*_* C. 29 delphi oop rtti delphi-6

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

我试着看看Delphi的帮助,我理解这些成员具有相同的可见性,但我不太清楚他们的差异如何,我何时应该使用已发布的成员而不是公共成员.

非常感谢.

And*_*and 26

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

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

上市

public
  property MyProperty: integer read FMyProperty write FMyProperty
Run Code Online (Sandbox Code Playgroud)

MyProperty不会是在Object Inspector可见.

发布时间

published
  property MyProperty: integer read FMyProperty write FMyProperty
Run Code Online (Sandbox Code Playgroud)

MyProperty 将在Object Inspector中可见.

  • 虽然这是正确的,但它出现在对象检查器中的根本原因是已发布成员存在RTTI元数据.换句话说,你所看到的是潜在差异的一个影响.更正确的答案是已发布的成员有RTTI,而公众成员则没有. (3认同)
  • 我认为值得指出的是,如果你问一个关于公共和已发布方法之间差异的问题,那么术语RTTI可能对你来说也不会有任何意义.安德烈亚斯提供了一个非常有用的答案. (2认同)

R-D*_*R-D 25

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

  • RTTI代表运行时类型信息或Delphi编译器在设计时需要的信息,以使对象检查器和Delphi IDE的其他部分在设计时正常工作. (10认同)
  • 为了完整性:Delphi 2010也可以为公共成员生成RTTI,实际上可以为所有成员生成RTTI,包括protected和private.但是已发布的成员仍然是由Object Inspector"发布"并由自动流机制使用的成员. (4认同)

mjn*_*mjn 9

作为旁注,发布了另一件特别的东西:

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

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

    function DecryptPassword(const AValue): string;  
  public
    constructor Create(const AName, AEncryptedPassword: string);
  end; 
Run Code Online (Sandbox Code Playgroud)

Name,Password并且DecryptPassword()在世界范围内可见.