如何重写私有属性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吗?