gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:11:30 25 4
gpt4 key购买 nike

我有两个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com