delphi – 在后代类中将setter添加到property
发布时间:2020-12-15 09:28:21 所属栏目:大数据 来源:网络整理
导读:我有两个Delphi类.父类声明字符串字段FSSN并将属性SSN与具有直接读取和写入字段的访问器匹配.在我的子类中,我想重新声明属性SSN以使用子类中的setter(如果可能,在将其写入字段之前转换SSN). 属性SSN将由父类的方法设置,但是(如果实例是子类的实例)我希望调用
我有两个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 解决方法
没有;那是不可能的.
子类可以访问父类,但父类不知道子类,并且父类中没有任何声明为虚拟的东西,您可以使用多态来路由. 在重写方法的情况下,有一个VMT可用于路由到正确的dscendant类,但是没有setter的直接属性赋值无法虚拟化.您需要在父级中声明为虚拟的setter,然后后代上的覆盖setter将起作用.没有办法虚拟化直接变量赋值. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |