Vit*_*rto 4 delphi getter setter properties class
所以我对OO编程有点新意.Delphi的属性旨在成为获取类数据的"更优雅"方式,而不是getter/setter(在此处读取业务类中属性vs getter/setter的使用).
我应该何时直接使用这些字段,何时应该在属性中使用getter/setter?我只是在需要操纵数据时才会说话,但我不确定.
编辑:
省略一个除了返回字段本身值之外什么都不做的setter是错误的吗?
property Field :integer read FField write FField;
Run Code Online (Sandbox Code Playgroud)
NGL*_*GLN 12
首先,从属性文档中快速总结:
属性(如字段)定义对象的属性.但是,虽然字段仅是可以检查和更改其内容的存储位置,但属性将特定操作与读取或修改其数据相关联.属性提供对对象属性的访问的控制,并且它们允许计算属性.
实际上,通过使用getter和setter来实现存储和访问的分离,并保留属性.这是事实,但你链接的问题源于语言差异:Delphi确实有属性,那里的答案已经解释了为什么要使用它们.两个最明显的原因是(1)更清晰的代码和(2)分配能力.我认为这个答案已经相当广泛.
此外,在不使用属性的情况下,总是需要吸气剂和固定剂,而不需要吸气剂和固定剂.假设一个setter实现,但没有getter:一个属性可以直接读取该字段.
当您只声明属性的名称及其类型时,Delphi的类完成默认为读取私有字段和设置私有字段的私有setter.请注意,这只是默认配置,您可以再次根据需要进行修改.当您完全指定属性声明时,类完成将遵守并根据声明的要求添加私有字段,getter和/或setter.
省略一个除了返回字段本身值之外什么都不做的setter是错误的吗?
当一个属性没有getter或setter并且它只是读取和写入字段时,你可以得出结论,除了一致之外没有区别.但事实并非如此.该字段和属性具有不同的名称,因此可能具有不同的含义.意思是你可以给.请参阅使用属性而不是同一单元的类方法中的字段是不好的做法?.
......我只是在需要操纵数据时...
嗯,这是部分正确的.操纵是众多原因之一.考虑Price
类型的属性String
及其私有字段FPrice
:
FPrice
是另一个领域的一部分,或者当它超出了本课程的责任范围时,请注意,Price
房产非常简陋.离开它的二传手或吸气剂以便将来实施是非常有可能的.但想象一下更高级的属性,这些属性离不开setter或getter:
在咨询之前需要创建的字段:
function TMyObject.GetBarelyUsed: TRare;
begin
if FBarelyUsed = nil then
FBarelyUsed := TRare.Create(Self);
Result := FBarelyUsed;
end;
Run Code Online (Sandbox Code Playgroud)可以选择一个项目,但项目本身不知道该怎么做.而是所有者.注意在这种情况下完全没有私有字段:
procedure TItem.SetSelected(Value: Boolean);
begin
if Value <> Selected then
begin
if Value then
Owner.Selection.Add(Self)
else
Owner.Selection.Remove(Self);
end;
end;
Run Code Online (Sandbox Code Playgroud)图像控件,专门用于查看您自己的图像格式.FileName
属性的分配包括:检查正确的文件扩展名,检查文件存在,将文件名存储在私有字段中,加载文件,调整图片的尺寸,或者撤消先前的分配:
procedure TAwDxfImage.SetFileName(const Value: TFileName);
begin
if FFileName <> Value then
if SameText(ExtractFileExt(Value), '.' + SDxf) and
FileExists(Value) then
begin
FFileName := Value;
FGraphic.LoadFromFile(FFileName);
FGraphic.SetBounds(Width, Height);
end
else
begin
FFileName := '';
FGraphic.Clear;
end;
end;
Run Code Online (Sandbox Code Playgroud)