我定义了一个基类和一些派生类,它们永远不会被实例化。它们只包含类函数和两个类属性。
问题是Delphi要求使用 static 关键字声明属性get属性的方法,因此无法声明虚拟,所以我可以在派生类。
因此,此代码将导致编译错误:
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;
答案 0 :(得分:4)
如何定义一个类属性,其结果值可以在派生类中重写?
您不能,正如编译器错误消息所表明的那样:
E2355类属性访问器必须是类字段或类静态方法
类字段在两个通过继承相关的类之间共享。所以不能用于多态。而类静态方法也不能提供多态行为。
使用虚拟类函数而不是类属性。
答案 1 :(得分:0)
type
// Abstraction is used at sample to omit implementation
TQuantity = class abstract
protected
class function GetID: string; virtual; abstract;
class procedure SetID(const Value: string); virtual; abstract;
public
// Delphi compiler understands class getters and setters
{class} property ID: string read GetID write SetID;
end;
var
Quantity: TQuantity;
begin
Quantity.ID := '?';