gpt4 book ai didi

delphi - 如何在 Delphi 中重写类属性 getter

转载 作者:行者123 更新时间:2023-12-03 15:29:24 33 4
gpt4 key购买 nike

我定义了一个基类和一些派生类,它们永远不会被实例化。它们仅包含类函数和两个类属性。

问题是Delphi要求类属性的property get方法用static关键字声明,因此不能声明virtual,所以我可以重写它派生类。

所以这段代码会导致编译错误:

    TQuantity = class(TObject)
protected
class function GetID: string; virtual; //Error: [DCC Error] E2355 Class property accessor must be a class field or class static method
class function GetName: string; virtual;
public
class property ID: string read GetID;
class property Name: string read GetName;
end;

TQuantitySpeed = class(TQuantity)
protected
class function GetID: string; override;
class function GetName: string; override;
end;

所以问题是:如何定义一个类属性,其结果值可以在派生类中重写?

使用Delphi XE2,Update4。

更新:根据 David Heffernan 的建议,使用函数而不是属性解决了这个问题:

    TQuantity = class(TObject)
public
class function ID: string; virtual;
class function Name: string; virtual;
end;

TQuantitySpeed = class(TQuantity)
protected
class function ID: string; override;
class function Name: string; override;
end;

最佳答案

How do you define a class property whose resulting value can be overridden in derived classes?

您不能,正如编译器错误消息所表明的那样:

E2355 Class property accessor must be a class field or class static method

类字段在通过继承相关的两个类之间共享。所以不能用于多态性。并且类静态方法也无法提供多态行为。

使用虚拟类函数而不是类属性。

关于delphi - 如何在 Delphi 中重写类属性 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11013467/

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