gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:50:46 24 4
gpt4 key购买 nike

我正在开发一个旧的遗留项目,该项目有几个类,其中 published 部分始终声明为内部没有任何内容,即:

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

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

[DCC Warning] uMyUnit.pas(141): W1055 PUBLISHED caused RTTI ($M+) to be added to type 'TMyClass'

我不知道前任开发人员是否出于某种正当原因声明了这些已发布部分。删除空的 published 部分是否总是安全的,或者是否会导致应用程序行为发生一些变化?

最佳答案

类本身没有任何区别 - 但重要的是,从具有 {$M+} 的类继承的任何类的默认可见性都会从 public 更改为已发布!

请参阅此示例代码:

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 的方式- 它们在表单顶部没有明确的可见性,该表单继承自已声明 {$M+}TComponent

关于delphi - 删除已发布的空部分总是安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774226/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com