フォローアップの質問this question :(これは重複していないことに注意してください、私はここに代案を求めています)。レコードのリスト実装
には、次の作業を行うためにどのような方法があります:
type
List <T> = record
private
FList : TList <T>;
FGuard : IInterface,
procedure CheckCreated;
public
procedure Add(const Value : T);
end;
procedure List <T>.CheckCreated;
begin
if (FGuard = nil) then
begin
FList := TList <T>.Create;
FGuard := TGuard.Create (FList); // guard calls free on list in destructor
end;
end;
procedure List <T>.Add (const Value : T);
begin
CheckCreated;
FList.Add (Value);
end;
は、理想的には私はこのようにそれを使用したい:リンク、質問への回答で説明したように
function ReturnHandles : List <THandle>;
begin
Result.Add (2);
Result.Add (3);
end;
、これはそうではありません仕事(これは本当に哀れみです)。各呼び出しで新しいリストは作成されません。
残念ながら、これはどちらか動作しません:
function ReturnHandles : List <THandle>;
begin
Initialize (Result);
Result.Add (2);
Result.Add (3);
end;
Initialize
だけの参照カウントをデクリメントすることなく、インタフェースの参照を上書きするので、それは、ガードインタフェースおよびすべてのリストをリークします。
この方法を使用する方法はありますか?あるいは、レコードの代わりにこれをインターフェースにして、単に建設ラインで生きていくことをお勧めしますか?
function ReturnHandles : List <THandle>;
begin
Result := List <T>.Create;
Result.Add (2);
Result.Add (3);
end;
ありがとうございました!
ロブは最後の質問で、「Initialize」はgabrの答えに誤りがあると説明しました。だからあなたはそれを使ってはいけません。 –
これは私が書いたものです。この作業を行うための他の方法がある場合、またはオブジェクトを含む値の型を作成できない場合は、ご質問 – jpfollenius
ここでは、Delphiのルールに反対しています。あなたはこのようにして「道路」を一定の距離だけ下っているかもしれませんが、RECORDタイプのアプローチには大きなコストがかかります。 –