Delphi 发送了 TObjectList like var 参数

Delphi Sent TObjectList like var parameter

我有class

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
  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;

我收到错误 "Types of actual and formal var parameters must be identical"。我做错了什么?

只需将 TObjectList<TFolder> 替换为您定义的 TFolderList

procedure TForm1.FormCreate(Sender: TObject);
begin 
  olLOCALFolders := TFolderList.Create();
  Account.LoadFoldersFromDisk(olLOCALFolders);
end;

但是,您可能不需要在此处使用 var 参数 - 方法名称 LoadFoldersFromDisk 建议该方法将使用项目填充作为参数发送的列表,为此您可以按值发送列表.如果该方法会提醒列表对象的内存位置(而不是它的内容),即当 LoadFoldersFromDisk 可以释放原始列表并创建新列表时,您只需要使用 var 参数。

错误是因为您的子class 是一种新类型,与TObjectList<TFolder> 不同,因此出现错误。

像这样导出子class可能是错误的:

type
  TFolderList = class (TObjectList<TFolder>)
  end;

这样做会迫使所有各方都使用该类型,并剥夺您利用通用类型兼容性的机会。如果您有一个在 TObjectList<T> 上运行的通用方法,那么您的新类型将不兼容。

而是声明一个别名:

type
  TFolderList = TObjectList<TFolder>;

关于别名的要点是,它是同一类型的不同名称,而不是您的代码声明的新类型。

或者直接在任何地方使用 TObjectList<TFolder> 而无需声明 TFolderList

更广泛地说,您的 TFolder 类型似乎更适合作为值类型。我认为它作为记录可能比 class 更好。

此外,var 参数显示不正确。如果函数要修改引用,您将使用 var 参数。但它将填充调用者传入的列表。您应该从参数列表中删除 var。