2016-07-28 16 views
1

Ich habe KlasseDelphi Sent TObjectList wie var Parameter

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; 

Und ich habe Typ

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

Dann versuche ich, diese Art zu verwenden

TAccount = class 
    ... 
    FOLDERS: TFolderList; 
public 
    constructor Create(...); 
    destructor Destroy; override; 

    procedure LoadFoldersFromDisk(var _objectList: TFolderList); 
end; 

Wenn ich versuche, meine zu schicken TObject-Liste wie Parameter

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    olLOCALFolders := TObjectList<TFolder>.Create(); 
    Account.LoadFoldersFromDisk(olLOCALFolders); 
end; 

Ich bekomme Fehler "Typen von tatsächlichen und formalen var Parameter müssen identisch sein". Was mache ich falsch?

Antwort

4

Ersetzen Sie einfach die TObjectList<TFolder> Wtih die TFolderList Sie definiert eariler:

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

Allerdings brauchen Sie vermutlich nicht var Parameter hier verwenden - der Methodenname LoadFoldersFromDisk legen nahe, dass die Methode bevölkern die Liste als Parameter gesendet mit Artikeln, und dafür können Sie die Liste nach Wert senden. Sie müssen den Parameter var nur verwenden, wenn die Methode den Speicherbereich des Listenobjekts (im Gegensatz zum Inhalt) alarmiert, dh wenn die LoadFoldersFromDisk die ursprüngliche Liste freigeben und eine neue erstellen kann.

6

Der Fehler liegt daran, dass Ihre Unterklasse ein neuer Typ ist, der sich von TObjectList<TFolder> und damit vom Fehler unterscheidet.

Es ist wahrscheinlich ein Fehler eine Unterklasse wie folgt abzuleiten:

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

tun zwingt so alle Parteien diese Art zu verwenden und verweigert Ihnen die Möglichkeit, die Vorteile der gattungsgemäßen Art Kompatibilität zu nehmen. Wenn Sie eine generische Methode unter TObjectList<T> haben, wäre Ihr neuer Typ inkompatibel.

erklären Statt eine Alias:

type 
    TFolderList = TObjectList<TFolder>; 

Der Punkt, um einen Alias ​​ist, dass es ein anderer Name für den gleichen Typen ist wie eine neue Art gegenüber, die Ihr Code deklariert.

Oder einfach TObjectList<TFolder> überall ohne Deklaration TFolderList verwenden.

Allgemeiner scheint Ihr Typ TFolder besser geeignet zu sein, um ein Werttyp zu sein. Ich denke, es könnte besser sein als ein Rekord als eine Klasse.

Außerdem erscheint ein Var-Parameter falsch. Sie würden einen var-Parameter verwenden, wenn die Funktion die Referenz ändern würde. Aber es wird die Liste auffüllen, die vom Aufrufer übergeben wird. Sie sollten die Variable aus der Argumentliste entfernen.