代码之家  ›  专栏  ›  技术社区  ›  zeus

如何重写私有属性设置器?

  •  0
  • zeus  · 技术社区  · 5 年前

    我有这个(在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 在后代阶级?

    1 回复  |  直到 5 年前
        1
  •  7
  •   Remy Lebeau    5 年前

    简而言之,你不能。

    setter声明为 private 因此后代是不可接近的。但即使它是可访问的,也不会声明为 virtual 所以它不能 override 无论如何。

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

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

    但是,访问 纹理 属性通过 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;