4

基本クラスといくつかの派生クラスを定義しましたが、インスタンス化されることはありません。これらには、クラス関数と2つのクラスプロパティのみが含まれています。

問題は、Delphiがクラスプロパティのプロパティgetメソッドを静的キーワードenで宣言することを要求しているため、仮想として宣言できないため、派生クラスでオーバーライドできることです。

したがって、このコードはコンパイルエラーになります。

    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クラスプロパティアクセサは、クラスフィールドまたはクラス静的メソッドである必要があります

クラスフィールドは、継承によって関連付けられている2つのクラス間で共有されます。したがって、それはポリモーフィズムには使用できません。また、クラス静的メソッドもポリモーフィックな動作を提供できません。

クラスプロパティではなく、仮想クラス関数を使用します。

于 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 に答える