T_E*_*M_A 1 delphi parameters compiler-errors tobjectlist
我有课
TFolder = class
NODE_INDEX: Integer;
FIRST_INDEX : Integer;
CODE_NAME: AnsiString;
NAME: AnsiString;
constructor Create(NewNODE_INDEX, NewFIRST_INDEX: Integer; NewCODE_NAME, NewNAME: AnsiString);
destructor Destroy; override;
end;
Run Code Online (Sandbox Code Playgroud)
我有类型
type
TFolderList = class (TObjectList<TFolder>)
end;
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用这种类型
TAccount = class
...
FOLDERS: TFolderList;
public
constructor Create(...);
destructor Destroy; override;
procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
Run Code Online (Sandbox Code Playgroud)
当我尝试发送我的TObject列表像参数
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TObjectList<TFolder>.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
Run Code Online (Sandbox Code Playgroud)
我收到错误"实际和正式var参数的类型必须相同".我做错了什么?
错误是因为您的子类是一个新类型,不同于TObjectList<TFolder>
错误.
派生这样的子类可能是错误的:
type
TFolderList = class (TObjectList<TFolder>)
end;
Run Code Online (Sandbox Code Playgroud)
这样做会强制所有各方使用该类型,并拒绝您利用通用类型兼容性的机会.如果您有一个通用的方法,TObjectList<T>
那么您的新类型将是不兼容的.
而是声明一个别名:
type
TFolderList = TObjectList<TFolder>;
Run Code Online (Sandbox Code Playgroud)
关于别名的观点是,它是相同类型的不同名称,而不是您的代码声明的新类型.
或者只是TObjectList<TFolder>
在没有声明的情况下随处使用TFolderList
.
更广泛地说,您的TFolder
类型似乎更适合作为值类型.我认为作为记录而不是课程可能更好.
此外,var参数显示不正确.如果函数要修改引用,您将使用var参数.但是它将填充调用者传入的列表.您应该从参数列表中删除var.