如何重写私有属性setter?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何重写私有属性setter?相关的知识,希望对你有一定的参考价值。

我已经此(在Delphi源代码中定义):

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

如何重写在子类中的setter SetTexture

答案

总之,你不能。

setter方法声明为private,因而不是后人访问。但是,即使它是可访问的,它不声明为virtual所以它不能无论如何override'n。

后代能够在这种情况下,唯一要做的是(重新)有自己的二传手声明自有物业(它甚至可以重复使用相同的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;

以上是关于如何重写私有属性setter?的主要内容,如果未能解决你的问题,请参考以下文章

如何为python类中的私有属性编写getter-setter方法?

具有公共getter的抽象属性,可以在具体类中定义私有setter吗?

iOS开发 私有变量 私有属性的使用选择

JavaScript中闭包实现的私有属性的getter()和setter()方法

9属性和函数的私有化,继承,重写

C#自定义getter / setter没有私有变量