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 パラメーターと正式な 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

TObjectList<TFolder>以前に定義したものに置き換えるだけTFolderListです:

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

ただし、おそらくここで var パラメーターを使用する必要はありません。メソッド名LoadFoldersFromDiskは、メソッドがパラメーターとして送信されたリストにアイテムを入力することを示唆しており、そのためにリストを値で送信できます。var パラメータを使用する必要があるのは、メソッドが (コンテンツではなく) リスト オブジェクトのメモリ位置を警告する場合のみです。つまりLoadFoldersFromDisk、元のリストを解放して新しいリストを作成できる場合です。

于 2016-07-28T10:40:26.630 に答える