1

我有课

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;

我收到错误“实际和正式 var 参数的类型必须相同”。我做错了什么?

4

2 回答 2

6

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

像这样派生子类可能是一个错误:

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

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

而是声明一个别名:

type
  TFolderList = TObjectList<TFolder>;

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

或者简单地TObjectList<TFolder>在任何地方使用而不声明TFolderList.

更广泛地说,您的TFolder类型似乎更适合作为值类型。我认为作为记录而不是课堂可能会更好。

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

于 2016-07-28T11:33:44.007 回答
4

只需用您定义的earilerTObjectList<TFolder>替换:TFolderList

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

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

于 2016-07-28T10:40:26.630 回答