繁体   English   中英

向后代类中的属性添加设置器

[英]Add setter to property in descendant class

我有两个Delphi类。 父类声明一个字符串字段FSSN,并将属性SSN与直接读取和写入该字段的访问器进行匹配。 在我的子类中,我想重新声明属性SSN,以使用子类中的设置器(如果可能,在将SSN写入字段之前对其进行转换)。

属性SSN将由父类的方法设置,但是(如果实例是子类的实例)我希望调用 setter。 但是,当我运行代码时,我从未输入子设置器,并且似乎使用父级中的属性声明直接设置了该字段。

能做到吗?

(我意识到我可以通过在父类中引入setter过程并在子类中重写来实现此目的;如果可能的话,我宁愿不打扰父类)。

这是我到目前为止的内容(当然是大大简化的版本):

TCustomPerson = class(TObject)
  protected
    FSSN: String;
  public
    procedure LoadFromXML(ANode: IXMLNode);
    property SSN: String read FSSN write FSSN;

TMyPerson = class(TCustomPerson)
  protected
    procedure SetSSN(ASSN: String);
  public
    property SSN: String read FSSN write SetSSN; // <=== Setter introduced.

 procedure TCustomPerson.LoadFromXML(ANode: IXMLNode);
 var ThisSSN: String;
 begin
    //extract SSN from XML into ThisSSN
    SSN := ThisSSN;                             // Expect to invoke SetSSN.
 end

procedure TMyPerson.SetSSN(ASSN: String);
begin
    FSSN := ValidateSSN(ASSN);                  // <== Breakpoint here never reached.
end

没有; 那是不可能的。

子类可以访问父类,但是父类不了解子类,并且在父类中没有任何声明为虚拟的可以使用多态性进行路由的东西。

在使用重写方法的情况下,可以使用VMT来路由到适当的dscendant类,但是没有设置程序的直接属性分配不能被虚拟化。 您需要在父级中有一个设置器,该设置器被声明为虚拟的,然后后代上的覆盖设置器将起作用。 无法虚拟化直接变量分配。

我有使用RTTI的解决方法。 您只需要发布SSN属性。

 procedure TCustomPerson.LoadFromXML(ANode: IXMLNode);
 var ThisSSN: String;
 begin
    //extract SSN from XML into ThisSSN
    SetStrProp(Self,'SSN',ThisSSN);
 end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM