这完全是关于班级的设计。从技术上讲,你可以用 属性做的“所有事情”,你也可以用 不用 属性做,但是代码不会那么优雅。良好的设计还使类更易于使用,并降低出错的风险。
首先,你的比较
TPerson = class
private
FName: string;
public
property Name: string read FName write FName;
end;
到
TPerson = class
private
FName: string;
public
procedure SetName(const Name: string);
function GetName: string;
end;
不太公平。事实上,在第一种情况下,当值被设置(或读取)时,您没有机会做某事。所以更合适的比较是将后面的代码与
TPerson = class
private
FName: string;
procedure SetName(const Name: string);
function GetName: string;
public
property Name: string read GetName write SetName;
end;
例如,如果您编写一个控件,您通常需要在更改属性时使控件无效(基本上是重新绘制),例如TPerson 的“毛衣颜色”。例如,
TPerson = class
private
FSweaterColor: string;
procedure SetSweaterColor(const Value: TColor);
public
property SweaterColor: TColor read FSweaterColor write SetSweaterColor;
end;
...
implementation
procedure TPerson.SetSweaterColor(const Value: TColor);
begin
if FSweaterColor <> Value then
begin
FSweaterColor := Value;
Invalidate; // causes a repaint of the control
end;
end;
无论如何,属性的意义何在?嗯,基本上,重点是为该类创建一个漂亮的接口:对于对其实现细节不感兴趣的人来说,它应该易于使用。通过使用属性,您可以实现此目标。实际上,要读取毛衣的当前颜色,您只需读取Anna.SweaterColor,要设置它,您只需Anna.SweaterColor := clRed。您不知道这是否只是设置变量或导致过程运行,您不在乎。就您而言,TPerson 对象只具有一个名为 SweaterColor 的可读且可设置的属性。
您还可以创建只读(无write)或只写(无read)的属性。但是无论您如何实现属性的read 和write(如果有的话),从类用户的角度来看,该属性看起来都是一样的。他不必记得使用SetSweaterColor 或GetSweaterColor(事实上,它们是私有的,他无法访问),而只需要使用SweaterColor 属性。
这也暗示了使用属性的另一个好处。公共和发布的属性对类的用户可见,而私有成员不可见(如字段FSweaterColor 和SetSweaterColor 过程)。这很好。因为现在您知道类用户更改人的毛衣颜色的唯一方法是使用SweaterColor 属性,它保证会重新绘制控件。如果FSweaterColor 变量是公开的,该类的用户可能会设置它并想知道,“为什么当我更改毛衣颜色时没有任何反应?”当然,您不需要属性来获得此好处:私有 FSweaterColor 字段和公共 GetSweaterColor 和 SetSweaterColor 也可以,但是即使如此,您也需要编写 GetSweaterColor 函数无需处理即可获得颜色。此外,该类的用户需要学习使用两个标识符而不是一个。
更具体地说,如果您使用 Delphi IDE 进行编程,您将看到 published property (-y+ies) 将显示在 Object Inspector 中,您可以在其中读取/更改它们(如果适用) .如果没有房产,这怎么可能?
话虽这么说,有时你不使用属性,即使你可以。例如,如果您有一个只读“属性”,您可能会选择一个公共 GetSomething 函数而不是只读属性。毕竟,这将为您节省一些编码。同样,如果您有一个只写属性,您可以使用单个公共SetSomething 过程,这也将节省您的代码。最后,如果你有一个读/写属性不需要任何处理(既不需要获取也不需要设置),你可以简单地使用公共变量!
所以,毕竟,您需要逐个班级决定一个好的班级设计。我想我过长的答案的简短版本类似于大卫的评论:
使用您喜欢的任何一个,哪个更方便。