4

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

问题是 Delphi 要求类属性的属性 get 方法用static关键字 en 声明,因此不能声明为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;
4

2 回答 2

4

如何定义一个类属性,其结果值可以在派生类中被覆盖?

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

E2355 类属性访问器必须是类字段或类静态方法

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

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

于 2012-06-13T11:05:04.877 回答
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 := '?';
于 2016-11-19T12:13:58.990 回答