我正在处理一个旧的旧项目,该项目有几个类,其中总是声明published
部分,而其中没有任何内容,即:
TMyClass = class
public
procedure DoSomething();
published
end;
在编译时,我收到以下警告消息:
[DCC警告] uMyUnit.pas(141):W1055发布导致RTTI($ M +) 添加为“ TMyClass”类型
我不知道前任开发人员是否出于某些正当理由已经声明了这些published
节。
始终删除空白的published
节是安全的还是会导致应用程序行为发生某些变化?
答案 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.FieldAddress
或TObject.MethodAddress
传入字段或方法的名称,并返回指向该字段或方法的指针。它仅适用于已发布的字段和方法。
这是从dfm加载来设置所有那些IDE生成的字段(如Button1
或将Button1Click
方法连接到Button1.OnClick
的方式-它们在您的顶部没有明显的可见性从声明为TComponent
的{{1}}继承的形式。
答案 1 :(得分:2)
其余代码是否真的需要访问该类的RTTI?
默认情况下,仅TPersistent
派生的类将{$M+}
直接应用于它们,而无需published
部分。
published
部分用于DFM流传输,需要RTTI。非持久性类不会在DFM中生成,但是RTTI还有其他用途。
因此,在不知道其余代码做什么的情况下,真正未知的是,删除空的published
节是否安全。