gpt4 book ai didi

delphi - 为什么要在类中使用属​​性?

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

我只是想知道为什么我应该在类中使用属​​性而不是“普通”变量(类属性?)。我的意思是这样的:

TSampleClass = class
public
SomeInfo: integer;
end;

TPropertyClass = class
private
fSomeInfo: integer;
public
property SomeInfo: integer read fSomeInfo write fSomeInfo;
end;

最大的区别是什么?我知道我可以定义 getter 和 setter 方法来分别获取或保存属性,但即使变量不是“属性”,这也是可能的。

我尝试寻找为什么要使用它,但没有找到任何有用的结果,所以我在这里询问。

谢谢

最佳答案

这只是特定案例的一个非常简单的示例,但仍然是一个非常常见的案例。

如果您有可视控件,则在更改变量/属性时可能需要重新绘制控件。例如,假设您的控件有一个 BackgroundColor 变量/属性。

添加此类变量/属性的最简单方法是让它成为公共(public)变量:

TMyControl = class(TCustomControl)
public
BackgroundColor: TColor;
...
end;

TMyControl.Paint 过程中,您使用BackgroundColor 的值绘制背景。但这并不能做到这一点。因为如果您更改控件实例的 BackgroundColor 变量,控件不会重新绘制自身。相反,直到下次控件因其他原因重新绘制自身时才会使用新的背景颜色。

所以你必须这样做:

TMyControl = class(TCustomControl)
private
FBackgroundColor: TColor;
public
function GetBackgroundColor: TColor;
procedure SetBackgroundColor(NewColor: TColor);
...
end;

哪里

function TMyControl.GetBackgroundColor: TColor;
begin
result := FBackgroundColor;
end;

procedure TMyControl.SetBackgroundColor(NewColor: TColor);
begin
if FBackgroundColor <> NewColor then
begin
FBackgroundColor := NewColor;
Invalidate;
end;
end;

然后使用该控件的程序员必须使用MyControl1.GetBackgroundColor来获取颜色,并使用MyControl1.SetBackgroundColor来设置它。那就尴尬了。

使用属性,您可以两全其美。事实上,如果你这样做

TMyControl = class(TCustomControl)
private
FBackgroundColor: TColor;
procedure SetBackgroundColor(NewColor: TColor);
published
property BackgroundColor: TColor read FBackgroundColor write SetBackgroundColor;
end;

...

procedure TMyControl.SetBackgroundColor(NewColor: TColor);
begin
if FBackgroundColor <> NewColor then
begin
FBackgroundColor := NewColor;
Invalidate;
end;
end;

然后

  • 从程序员的角度来看,他可以使用单个标识符(MyControl1.BackgroundColor 属性)读取和设置背景颜色,并且
  • 当他设置控件时,控件会被重新绘制!

关于delphi - 为什么要在类中使用属​​性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6391632/

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