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