K2さんの雑記
2004-02-20(Fri) [長年日記]■ [Delphi]Assign使ってますか(1)VCLのTPersistentクラスには、Assignというメソッドがpublicで宣言されている。この中身をそのまま使うと例外が上がるだけである。よってTPersistent継承クラスを作った場合は、Assign*1をoverrideして、再定義する。 例えば、TItemをTPersistentから継承する場合を考えてみよう。インターフェイス定義は以下のようになる。 TItem = class(TPersistent) private FName: string; procedure SetName(const Value: string); public procedure Assign(Source: TPersistent); override; property Name: string read FName write SetName; end; TItemはNameプロパティを持っている。通常は、もっとたくさんのプロパティを持つことになるだろう。たとえばファイルを扱うクラスなら、Filename、Date、Sizeなんかが思いつく。URLを扱うクラスなら、URLそのものやCheckDateなど。ここでは、簡単にするためにNameだけを持つItemクラスだと考える。 実装部は以下のようになる。 procedure TItem.Assign(Source: TPersistent); begin if Source is TItem then begin Name := TItem(Source).Name; end else inherited Assign(Source); end; procedure TItem.SetName(const Value: string); begin FName := Value; end; SetNameメソッドは、Delphiが作るスケルトンそのままである。Assignの方だが、まず渡されたSourceがTItemかどうか調べる。TItemじゃない場合は、inheritedしてTPersistentのAssignを呼び出し、例外を上げる。 渡されたSourceがTItemの場合は、プロパティのコピーを行う。TItemはNameしか持たないので、ここではNameだけをコピーしている。 こう定義されたTItemは、以下のように使う。 var Item1, Item2: TItem; begin Item1 := TItem.Create; try Item1.Name := 'Item1の名前'; Item2 := TItem.Create; try // Item1の中身をItem2にコピー Item2.Assign(Item1); ShowMessage(Item2.Name); finally Item2.Free; end; finally Item1.Free; end; end; これでアイテムの中身がコピーできる。 一見、「なーんだ」という感じのする方法論であるが、オブジェクト指向で使う具体的な方法論のほとんどは、「なーんだ」という手法の組み合わせである。しかし、その有効性は高い。 デザインパターン等では、Cloneという、自分のクローンを作成してオブジェクトを返すメソッドが出てくるが、VCLではCloneはなくAssignを使用している。個人的にはAssignの方が利用できる効果が高いと感じている。 さて、時間となった。Assignをどういう場面で活用していくかは、またの機会に。 *1 またはAssignToをoverrideしてもよいが、ここではAssignをそのままoverrideすることとして話を進める 1965|09|
|
//
自己紹介
自己紹介
広告
計るだけダイエット
つっこみリスト
TrackBacks
日記仲間
な/
す/
ひ/
最近の日記
|