【问题标题】:Inherit a property in Delphi继承德尔福的财产
【发布时间】:2023-03-08 17:53:01
【问题描述】:

我正在使用 Delphi XE3,我需要以这样的方式覆盖一个属性,我仍然调用基类 getter 和一个新的类 setter。

例子:

TBaseClass = class
  ...
  property XML:string read GetXML write SetXML;
end ;

TNewClass = class(TBaseClass)
  ...
  property: XML .....
end;

更新:

BaseClass 是在一个 .dcu 编译的文件中,所以我不能直接更改这个文件。

【问题讨论】:

  • 在 TBaseClass 中声明 SetXML virtual 并在 TNewClass 中覆盖它。
  • 为什么这个问题会受到保护?从答案中我看不出有任何理由这样做
  • @RBA:这个问题受到垃圾邮件的保护。最近有人向某个特定 SO 成员发布了令人讨厌的内容,而此讨论收到了其中一些消息,这些消息已被删除。

标签: delphi


【解决方案1】:

我的问题用这种方法解决了:

在 TNewClass 中:

private
  function GetXML: string;
  procedure SetXML(const Value: string);

public
  property XML: string read GetXML write SetXML;

procedure TNewClass.SetXML(const Value: string);
begin
  do my job..
end;


function TNewClass.GetXML: string;
begin
  //here call the base GetXML      
  result := Inherited XML;//result := string(Inherited XML);
end;

【讨论】:

  • 你不需要 getter 中的类型转换:result := inherited XML;
  • 我不知道为什么这被否决了。考虑到基类代码无法访问以将属性的 getter/setter 方法更改为虚拟(这将是 理想 解决方案),这实际上是正确的答案。派生类可以重新声明属性以使用新的 getter/setter 方法,这些方法在需要时调用基类方法。甚至 RTL/VCL 类也能做到这一点。
  • @MatheusFreitas:你不能 reintroduce 一个属性,如果你只是给它们提供不与基类冲突的唯一名称,你不需要 reintroduce 属性 getter/setter 方法。
猜你喜欢
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
相关资源
最近更新 更多