这一切都与类的设计有关。从技术上讲,你可以在不使用属性的情况下做到所有事情,但代码将不会如此优雅。良好的设计也使类更易于使用,并降低出错的风险。
首先,你在进行比较
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;
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)将显示在对象检查器中,在那里您可以读取/更改它们(如果适用)。如果没有属性,这怎么可能呢?
所有这些都说了,有时候即使你可以使用属性,你也不会使用。例如,如果你有一个只读的“属性”,你可能会选择一个单一的公共
GetSomething
函数,而不是一个只读属性。毕竟,这会节省一些编码工作。同样,如果你有一个只写属性,你可以使用一个单一的公共
SetSomething
过程,这也将节省你的代码。最后,如果你有一个既可读又可写的属性,而且两种方式都不需要处理,那么你可以简单地使用一个公共变量!
因此,归根结底,你需要根据每个类的情况来决定一个良好的设计。我想我的过于冗长的答案的简短版本与David的评论类似:
使用任何你喜欢的,任何更方便的方法。
F
作为前缀,例如FName
。 - Uli Gerhardtp
作为私有域的名称,因为P
已经被广泛用作指针类型,例如PChar
。而F
是最常用的。 - Jerry Dodge