我有这个(在delphi源代码中定义):
TCanvasTextureMaterial = class(TCustomMaterial)
private
[Weak] FTexture: TTexture;
procedure SetTexture(const Value: TTexture);
protected
public
property Texture: TTexture read FTexture write SetTexture;
end;
如何在子孙类中覆盖设置器SetTexture
?
答案 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;