Delphi 我可以有一个默认的类属性吗?

Delphi 我可以有一个默认的类属性吗?,delphi,properties,record,Delphi,Properties,Record,我试图用一条记录和一个默认数组属性替换一个显式声明的X:array[TypeX]字符串。 通过一些魔法,我可以让它工作,但前提是我的记录中有一个虚拟变量 我希望下面的代码能够编译所有失败的代码。但是当我访问默认属性时,我得到了一个无意义的错误 unit Test; interface type TSyntaxNodeType = (ntAddr,ntDeref); SyntaxNodeNames = record strict private class var FData

我试图用一条记录和一个默认数组属性替换一个显式声明的X:array[TypeX]字符串。 通过一些魔法,我可以让它工作,但前提是我的记录中有一个虚拟变量

我希望下面的代码能够编译所有失败的代码。但是当我访问默认属性时,我得到了一个无意义的错误

unit Test;
interface

type
  TSyntaxNodeType = (ntAddr,ntDeref);
  SyntaxNodeNames = record
  strict private
    class var FData: array[TSyntaxNodeType] of string;
    class function GetItem(const index: TSyntaxNodeType): string; static; inline;
    class constructor Init;
  public
    class property Items[const index: TSyntaxNodeType]: string read GetItem; default;
  end;

implementation
uses SysUtils, TypInfo;

{ TSyntaxNodeNames }

class function SyntaxNodeNames.GetItem(const index: TSyntaxNodeType): string;
begin
  Result:= FData[index];
end;

class constructor SyntaxNodeNames.Init;
var
  value: TSyntaxNodeType;
begin
  for value := Low(TSyntaxNodeType) to High(TSyntaxNodeType) do
    FData[value] := Copy(LowerCase(GetEnumName(TypeInfo(TSyntaxNodeType), Ord(value))), 3);
end;

function Fail: string;
begin
  Result:= SyntaxNodeNames[ntAddr];  //E2029 '(' expected but '[' found
end;

end.
如果我把周围的一切都改成非类方法,它就会工作,但我希望记录没有实例,只有一个类型。我不需要这个实例。 我不想要变量数组,也不想使用可写常量

问题: 默认类属性应该工作吗?这是一个bug,还是默认类属性被禁止了

更新 这是修复方法,但我不喜欢我需要一个从未实例化过的伪变量

type
  TSyntaxNodeNames = record
  strict private
    class var FData: array[TSyntaxNodeType] of string;
    function GetItem(const index: TSyntaxNodeType): string; inline;
    class constructor Init;
  public
    property Items[const index: TSyntaxNodeType]: string read GetItem; default;
  end;

var
  SyntaxNodeNames: TSyntaxNodeNames; //for some reason default does not work on class properties.

implementation
uses SysUtils, TypInfo;

{ TSyntaxNodeNames }

function TSyntaxNodeNames.GetItem(const index: TSyntaxNodeType): string;
begin
  Result:= FData[index];
end;

class constructor TSyntaxNodeNames.Init;
var
  value: TSyntaxNodeType;
begin
  for value := Low(TSyntaxNodeType) to High(TSyntaxNodeType) do
    FData[value] := Copy(LowerCase(GetEnumName(TypeInfo(TSyntaxNodeType), Ord(value))), 3);
end;

function DoesNotFail: string;
begin
  Result:= SyntaxNodeNames[ntAddr];  //Works as intended.
end;

end.

记录不是类,如果你不想要一个实例,类就是最好的选择

这可以根据您的需要工作,请注意,没有以下实例:

unit Unit13;

interface

type
  TSyntaxNodeType = (ntAddr,ntDeref);

  SyntaxNodeNames = class
  strict private
    class var FData: array[TSyntaxNodeType] of string;
    class function GetItem(const index: TSyntaxNodeType): string; static; inline;
    class constructor Init;
  public
    class property Items[const index: TSyntaxNodeType]: string read GetItem; default;
  end;

implementation
uses SysUtils, TypInfo;

{ TSyntaxNodeNames }

class function SyntaxNodeNames.GetItem(const index: TSyntaxNodeType): string;
begin
  Result:= FData[index];
end;

class constructor SyntaxNodeNames.Init;
var
  value: TSyntaxNodeType;
begin
  for value := Low(TSyntaxNodeType) to High(TSyntaxNodeType) do
    FData[value] := Copy(LowerCase(GetEnumName(TypeInfo(TSyntaxNodeType), Ord(value))), 3);
end;

end.
我从主窗体这样调用它来测试

procedure TForm10.Button1Click(Sender: TObject);
begin
  Panel1.Caption := SyntaxNodeNames[ntAddr];
end;

但我相信您有自己的测试方法。

那么,问题是什么?@Dsm,如何编译上述代码?我可以有一个默认的类属性吗?@Victoria自从我问起这个问题就变了;-原著毫无疑问。