Delphi发送TObjectList就像var参数一样

时间:2016-07-28 10:34:38

标签: 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;

我有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参数的类型必须相同”。我做错了什么?

2 个答案:

答案 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参数