gpt4 book ai didi

delphi - 属性与功能或过程之间的区别

转载 作者:行者123 更新时间:2023-12-03 15:17:34 25 4
gpt4 key购买 nike

我们可以说:

type
TPerson = class
private
pName : string;
public
property Name : string read pName write pName;
end;

等于:
 type
TPerson = class
private
pName : string;
public
procedure SetName(val: string);
function GetName:String;
end;

//{... implementing SetName And GetName...}

??

请向我解释我们需要在哪里使用“属性”,在哪里不需要。肿瘤坏死因子

最佳答案

这都是关于类(class)设计的。从技术上讲,你可以用属性做的“一切”,你可以不用它们,但代码不会那么优雅。良好的设计还使类更易于使用,并降低了出错的风险。

首先,你的比较

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;

无论如何,属性的意义何在?好吧,基本上,关键是要为该类创建一个漂亮的接口(interface):对于对其实现细节不感兴趣的人来说,它应该易于使用。通过使用属性,您可以实现此目标。确实,要阅读毛衣的当前颜色,您只需阅读 Anna.SweaterColor ,并设置它,你只需 Anna.SweaterColor := clRed .您不知道这是否只是设置变量或导致过程运行,您不在乎。就您而言, TPerson对象只是有一个可读和可设置的属性,叫做 SweaterColor .

您还可以创建只读(无 write)或只写(无 read)的属性。但无论你如何实现 readwrite (如果有的话)属性,从类用户的角度来看,该属性看起来是一样的。他不必记得使用 SetSweaterColorGetSweaterColor (事实上​​,它们是私有(private)的,他无法访问),但只有 SweaterColor属性(property)。

这也暗示了使用属性的另一个好处。公共(public)和发布的属性对类的用户可见,而私有(private)成员不可见(如字段 FSweaterColorSetSweaterColor 过程)。这很好。因为现在您知道类(class)用户更改人的毛衣颜色的唯一方法是使用 SweaterColor属性,保证将重绘控件。如果 FSweaterColor变量是公开的,类的用户可能会设置它并想知道,“为什么当我改变毛衣颜色时没有任何事情发生?”当然,您不需要属性来获得此好处:私有(private) FSweaterColor领域和公众 GetSweaterColorSetSweaterColor也可以,但是你需要写一个 GetSweaterColor即使无需处理即可获得颜色。此外,该类的用户需要学习使用两个标识符而不是一个标识符。

更具体地说,如果您使用 Delphi IDE 编程,您将看到 published property (-y+ies) 将显示在对象检查器中,您可以在其中读取/更改它们(如果适用)。如果没有房产,这怎么可能?

话虽如此,有时即使可以,您也不使用属性。例如,如果您有一个只读“属性”,您可能会选择一个公共(public) GetSomething函数而不是只读属性。毕竟,这将为您节省一些编码。同样,如果您有一个只写属性,您可以使用单个公共(public) SetSomething过程,这也将节省您的代码。最后,如果你有一个读/写属性不需要任何处理(既不需要获取也不需要设置),你可以简单地使用公共(public)变量!

因此,毕竟,您需要逐个类(class)决定类(class)的良好设计。我想我过长的答案的简短版本类似于大卫的评论:

Use whichever you prefer, whichever is more convenient.

关于delphi - 属性与功能或过程之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14910028/

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