删除已发布的空白部分总是安全的吗?

时间:2019-09-03 14:55:57

标签: delphi access-modifiers

我正在处理一个旧的旧项目,该项目有几个类,其中总是声明published部分,而其中没有任何内容,即:

TMyClass = class
public
   procedure DoSomething();
published
end;

在编译时,我收到以下警告消息:

  

[DCC警告] uMyUnit.pas(141):W1055发布导致RTTI($ M +)   添加为“ TMyClass”类型

我不知道前任开发人员是否出于某些正当理由已经声明了这些published节。 始终删除空白的published节是安全的还是会导致应用程序行为发生某些变化?

2 个答案:

答案 0 :(得分:10)

该类本身没有区别-但是重要的是,任何继承自{$M+}的类的任何类的默认可见性都将从公开变为公开!

请参见以下示例代码:

uses
  TypInfo;

type
  TMyClass = class
  private
    fName: string;
    property Name: string read fName;
  published
  end;

  TMyOtherClass = class(TMyClass)
    property Name;
  end;

var
  propCount, i: Integer;
  props: PPropList;
begin
  propCount := GetPropList(TypeInfo(TMyOtherClass), props);
  for i := 0 to propcount - 1 do
    Writeln(props^[i].Name);
  Readln;
end.

您可以看到它列出了Name属性,但是当您从TMyClass删除发布的属性时,它不会-这是因为一旦TMyClass得到{$M+}时添加了任何成员声明而未明确说明其公开程度将与公众相对。

还将宣布其他声明为不可见的成员,例如字段。这在Delphi用于表单等的流系统中正在使用。 例如,您可以然后调用TObject.FieldAddressTObject.MethodAddress传入字段或方法的名称,并返回指向该字段或方法的指针。它仅适用于已发布的字段和方法。

这是从dfm加载来设置所有那些IDE生成的字段(如Button1或将Button1Click方法连接到Button1.OnClick的方式-它们在您的顶部没有明显的可见性从声明为TComponent的{​​{1}}继承的形式。

答案 1 :(得分:2)

这取决于

其余代码是否真的需要访问该类的RTTI?

默认情况下,仅TPersistent派生的类将{$M+}直接应用于它们,而无需published部分。

published部分用于DFM流传输,需要RTTI。非持久性类不会在DFM中生成,但是RTTI还有其他用途。

因此,在不知道其余代码做什么的情况下,真正未知的是,删除空的published节是否安全。