我有课
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;
我有Type
type
TFolderList = class (TObjectList<TFolder>)
end;
然后我尝试使用这种类型
TAccount = class
...
FOLDERS: TFolderList;
public
constructor Create(...);
destructor Destroy; override;
procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
当我尝试发送像参数
这样的TObject列表时procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TObjectList<TFolder>.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
我收到错误“实际和正式var参数的类型必须相同”。我做错了什么?
答案 0 :(得分:6)
错误是因为您的子类是一种新类型,与TObjectList<TFolder>
不同,因而错误。
导出这样的子类可能是错误的:
type
TFolderList = class (TObjectList<TFolder>)
end;
这样做会强制所有各方使用该类型,并拒绝您利用通用类型兼容性的机会。如果您在TObjectList<T>
上运行通用方法,那么您的新类型将不兼容。
而是声明别名:
type
TFolderList = TObjectList<TFolder>;
关于别名的观点是,它与同一类型的名称不同,而不是代码声明的新类型。
或者只是在任何地方使用TObjectList<TFolder>
而不声明TFolderList
。
更广泛地说,您的TFolder
类型似乎更适合作为值类型。我认为作为记录而不是课程可能更好。
此外,var参数显示不正确。如果函数要修改引用,您将使用var参数。但是它将填充调用者传入的列表。您应该从参数列表中删除var。
答案 1 :(得分:4)
只需将TObjectList<TFolder>
替换为您定义的预告片TFolderList
:
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TFolderList.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
但是,您可能不需要在此处使用var参数 - 方法名称LoadFoldersFromDisk
建议该方法将填充作为参数发送的列表与项目,并为此您可以按值发送列表。如果方法会提醒列表对象的内存位置(而不是它的内容),即LoadFoldersFromDisk
可以释放原始列表并创建新列表,则只需要使用var参数