DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

TInterfacedObject で自動破棄....の前にTObjectInterfaceHelper ぁぁぁぁ~~


    ∧,,∧      
   ミ,,゚Д゚彡,,,,,, 
    ∩,,,,,,,,,,,,,,⊃⊃

暑いですな。


一夏は超えたようですが、なかなか暑い日々、いかがお過ごしかしら。

さて、今日はDelphiで参照を失ったら自動破棄されるクラス
TInterfacedObjectを使ってみます。



デザインパターンなどでオブジェクトをあっちに渡したりこっちに渡したりするときには
安全にいきたいものです。
参照がどこで行方不明になって、メモリリークするかわかりません。

破棄しなくても、破棄忘れても、勝手に破棄されるくらいの安全さがあれば
オブジェクト指向な、気軽にデザインパターンを使っていけるような
コーディングの幅が広がるんですよね。


さってと、
そういう時に、Delphiで利用できるのが、TInterfacedObjectです。

Delphiインターフェースについての使い方は
TOBYソフトさんが詳しいのですが、
TOBYさんところでは、いわゆる「インターフェース」の使い方をするためにインターフェースを使っているようです。

意味わからん文章ですよね。でも、こう表現せざるおえないっす。

TOBYさんところでも、DelWikiでも書かれていますが、
Delphiのインターフェースを多くの人が使わず、実際に実に使いにくいと感じる点は

Delphiのインターフェースが、多重継承回避のための一般的なインターフェースとしての使い方(①)

だけではなく

参照がなくなったときの自動破棄オブジェクトを作るための仕組み(②)

と、機能と使い勝手が重なっているからなんですよね。


Delphiの7不思議というか、Delphi史上最大級の愚実装の一つかと思っています。
おかげで、①の機能も②の機能も、ほとんど誰も使用しないという事になっているのが現状です。


TOBYソフトさんでは、①の使い方をするために
TInterfacedBase という新しいオブジェクトを実装して、
ここから継承することによって②の機能を無効にしています。

TInterfacedBase 継承 → 自動破棄無し、インターフェースの機能のみ
TInterfacedObject 継承 → 自動破棄あり、インターフェース機能あり
どちらも継承していない → インターフェース機能は使えない

こんな風にわかりやすそうです。


私もいろいろ試しましたが、TInterfacedBase の実装をそのまま
クラスヘルパーでTObjectに対して、実装する事ができました。

これを適応すると、次のようになります。

TInterfacedObject 継承 → 自動破棄あり、インターフェース機能あり
それ以外 → 自動破棄なし、インターフェース機能あり


type
 TObjectInterfaceHelper = class helper for TObject
  function QueryInterface(const IID: TGUID; out Obj): HRESULT; stdcall;
  function _AddRef: Integer; stdcall;
  function _Release: Integer; stdcall;
 end;

function TObjectInterfaceHelper.QueryInterface(const IID: TGUID; out
Obj): HRESULT;
const
 E_NOINTERFACE = HResult($80004002);
begin
 if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE;
end;

function TObjectInterfaceHelper._AddRef: Integer;
begin
 Result := -1;
end;

function TObjectInterfaceHelper._Release: Integer;
begin
 Result := -1;
end;

これを使っておくと、全てのクラスに対して、インターフェース機能を遠慮なく使う事ができるので
GUIコントロール系のクラスや、
人の作ったクラスを、改造せずに継承して、インターフェース機能を使うことができます。

なかなか便利かもしれません。

とりあえず、どぞですよ。

ん?GUIコンポーネント系は気軽にインタフェース導入しようとしても
コンポーネントインストールが必要だからややこしいって?

例えば、ComboBoxとlistBoxとListViewに共通メソッドを持たせて共通インターフェースを持たせるのは
一苦労?

それが、そうでもないんですよ。



高血圧の持病を持ち回覧板を自在に操るが空気な三丁目の田中さん 20080116
http://twc.xrea.jp/20080116/
Delphiで手軽にコンポーネントを継承する方法。


かっこいい技ですね。
これで、コンポーネントでもインターフェースつかってあげることもできたり出来なかったり。



参考サイト。

Delphi/interfaceを使おう - TOBY SOFT wiki
http://tobysoft.net/wiki/index.php?Delphi%2Finterface%A4%F2%BB%C8%A4%AA%A4%A6


資料/インターフェイス - DelWiki
http://delwiki.info/?%E8%B3%87%E6%96%99%2F%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9


スポンサーサイト

| 未分類 | 00:11 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。