如何覆盖私有财产的设定者?

时间:2019-02-04 21:25:26

标签: delphi

我有这个(在delphi源代码中定义):

  TCanvasTextureMaterial = class(TCustomMaterial)
  private
    [Weak] FTexture: TTexture;
    procedure SetTexture(const Value: TTexture);
  protected
  public
    property Texture: TTexture read FTexture write SetTexture;
  end;

如何在子孙类中覆盖设置器SetTexture

1 个答案:

答案 0 :(得分:7)

总之,你不能。

该setter被声明为private,因此后代无法访问。但是,即使可以访问,也不会将其声明为virtual,因此无论如何都不会override'。

在这种情况下,后代唯一能做的就是用自己的设置器(重新)声明其自身的属性(它甚至可以重用相同的Texture属性名),例如:

type
  TMyCanvasTextureMaterial = class(TCanvasTextureMaterial)
  private
    function GetMyTexture: TTexture;
    procedure SetMyTexture(const Value: TTexture);
  public
    property Texture: TTexture read GetTexture write SetMyTexture;
  end;

但是,通过Texture指针访问TCanvasTextureMaterial属性将不会调用后代的setter,即使它确实使用了相同的属性名称:

var
  TM: TCanvasTextureMaterial;
begin
  TM := ...; // any TMyCanvasTextureMaterial object

  // reading from TM.Texture returns TCanvasTextureMaterial.FTexture,
  // it does not call TMyCanvasTextureMaterial.GetMyTexture()

  // assigning to TM.Texture calls TCanvasTextureMaterial.SetTexture(),
  // it does not call TMyCanvasTextureMaterial.SetMyTexture()
end;