delphi - 将setter添加到后代类的属性中

标签 delphi inheritance properties setter

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

属性 SSN 将由父类的方法设置,但是(如果该实例是子类的实例)我希望调用 child setter。但是,当我运行代码时,我从未输入子 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 可用于路由到正确的后代类,但没有 setter 的直接属性分配无法虚拟化。您需要在父级中声明为虚拟的 setter,然后在后代上覆盖 setter 才能工作。无法虚拟化直接变量赋值。

关于delphi - 将setter添加到后代类的属性中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12656417/

相关文章:

xml - 使用 Delphi 使用 AsmXML

delphi - 如何在 iOS 模拟器 Delphi Seattle 上进行 HTTPS 调用

java - 为什么 Spring @Configuration 类继承没有按预期工作?

c# - 使用继承的参数化继承泛型

c# - 派生类中属性变化的基类感知

delphi - 在组件中使用 FThumbnaiWidth 与 Get 和 Set

c# - 如何在C#.Net中使用反射(指定多少层次结构)来获取类的属性?

cocoa - Cocoa 中继承的、综合的属性的访问器

javascript - 对于按属性值

android - 数学表达式的奇怪值