Delphi类:Property vs Get/Set方法

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.

没有getter和setter的属性

省略一个除了返回字段本身值之外什么都不做的setter是错误的吗?

当一个属性没有getter或setter并且它只是读取和写入字段时,你可以得出结论,除了一致之外没有区别.但事实并非如此.该字段和属性具有不同的名称,因此可能具有不同的含义.意思是你可以给.请参阅使用属性而不是同一单元的类方法中的字段是不好的做法?.

什么时候使用吸气剂或吸气剂?

......我只是在需要操纵数据时...

嗯,这是部分正确的.操纵是众多原因之一.考虑Price类型的属性String及其私有字段FPrice:

  • 限制:当价格需要等于或高于零时,
  • 代表团:什么时候FPrice是另一个领域的一部分,或者当它超出了本课程的责任范围时,
  • 验证:当价格可能只有逗号后面两位小数时,
  • 解读:当价格输入数千,但应存储在美分,
  • 效果:当价格对另一个字段产生影响时,例如费率或保证金,
  • 激活:当价格编辑需要立即采取行动时,例如更新GUI,
  • 转换:当以美元输入价格但应以日元存储时,
  • 取消:当价格没有意义时,例如当它以科学记数法输入时.

请注意,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)

资料来源:NLDelphi