【发布时间】:2012-06-13 11:00:51
【问题描述】:
我已经定义了一个基类和一些派生类,它们永远不会被实例化。它们只包含类函数和两个类属性。
问题是Delphi要求类属性的属性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;
【问题讨论】:
-
如果
ID和Name是每个类的常量(getter 方法只返回每个类的常量值),您可以使用Attributes并使用它们标记类。 -
这对我来说是一个新概念......开始阅读它,但检索值似乎比仅使用虚拟类方法更复杂
-
嗯。看来我错了。当我们没有类实例时,很难实现属性(我不知道如何:))。无论如何,看看docwiki.embarcadero.com/RADStudio/en/Attributes_Index 使用属性,您可以使用例如
[ID('my class id')]或[Name('my class name string')]来注释您的类,然后在运行时为这些类(对象)提取属性值
标签: delphi delphi-xe2