TListを特定のクラスのListにする方法
|
みなさん、TListって使ってます?
TListはItemsプロパティで、いろんなオブジェクトにアクセスできる
とても便利なコレクションクラス(リスト)です。
これを利用すればコンポーネント配列なんて特に必要なくなりますし、
自分で作ったクラスが保持できます。
しかし、こういうコーディングしていませんか?
TMyClass( TList.Items[i] ).MyClassProperty
実際には特定のクラスのみItemsに保持したい場合が多いのに
TListはPointerを保持する汎用的なListなので
キャストしないとプロパティやメソッドが使えません。
TListのItemにアクセスするたびに
毎回キャストしなくてはいけないのであれば、大変めんどうですし
コーディング量も増えて綺麗ではありません。
そういう場合はTListを継承してしまいましょう。
とてもあっさりと可能です。
type節に追加します
TMyClassList = class(TList)
private
function Get(Index: Integer): TMyClass;
procedure Put(Index: Integer; const Value: TMyClass);
public
property Items[Index: Integer]: TMyClass read Get write Put; default;
end;
実装部には
{ TMyClassList }
function TMyClassList.Get(Index: Integer): TMyClass;
begin
Result := TMyClass( inherited Get(Index) );
end;
procedure TMyClassList.Put(Index: Integer; const Value: TMyClass);
begin
inherited Put( Index, Value );
end;
TMyClassは適当に変えてください。
これだけで、TListを使うのとほとんど同様に
TMyClassList.Items[i].MyClassProperty
という風にスッキリと使えます。
また、TListを継承する時ついでに
TMyClassList = class(TList)
public
destructor Destroy; override;
…
destructor TMyClassList.Destroy;
var
i: Integer;
begin
for i := 0 to Self.Count - 1 do
Self.Items[i].Free;
inherited Destroy;
end;
と実装しておくとListが破棄される時に
所有するItemも一緒に破棄されるので
結構便利に使えるでしょう。 |
|