在后代类中将setter添加到属性

时间:2012-09-29 20:53:19

标签: delphi inheritance properties setter

我有两个Delphi类。父类声明一个字符串字段FSSN,并将属性SSN与具有直接读写字段的访问器匹配。在我的子类中,我想重新声明属性SSN以使用子类中的setter(如果可能,在将其写入字段之前转换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

1 个答案:

答案 0 :(得分:5)

没有;那是不可能的。

子类可以访问父类,但父类不知道子类,并且父类中没有任何声明为虚拟的类,您可以使用多态来路由。

对于重写方法,有一个VMT可用于路由到正确的dscendant类,但是没有setter的直接属性赋值无法虚拟化。您需要在父级中声明为虚拟的setter,然后后代上的覆盖setter将起作用。没有办法虚拟化直接变量赋值。