- PR -

delegateとinterfaceの使い分け基準が理解できない

1
投稿者投稿内容
Tacchang
ベテラン
会議室デビュー日: 2004/09/05
投稿数: 55
お住まい・勤務地: 川崎市
投稿日時: 2005-08-03 09:50
みなさん、こんにちは。
ある昔の記事を理解するための助言をお願いいたします。
2003/07/05に日本ユニシス 尾島 良司様が「私がJavaからC#に乗り換えた10の理由」を書いていらっしゃいます。私は今それを読み返しているのですが、私の能力不足で意味を理解できない箇所があります。「インターフェイスが必要となるのは複数のメソッドがコンテキストを共有する場合だけである」という一説です。
この一説に関しては、結論は判るんだけど理由が理解できない、という状態で悩んでいます。
どなたか「コンテキストを共有する」とはどういう意味か教えて頂けないでしょうか。
餅宮餅吉
ベテラン
会議室デビュー日: 2005/03/04
投稿数: 57
お住まい・勤務地: 月餅のうまい店の隣
投稿日時: 2005-08-03 16:58
こんにちわ、餅宮です。

ポリモーフィズムによって受ける制約かと思います、ポリモーフィズムによって抽象化されるメソッドが複数ある場合にはインターフェイスを、単一の場合にはデリゲート使えってことだと思います。


[ メッセージ編集済み 編集者: 餅宮餅喜 編集日時 2005-08-03 17:03 ]
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2005-08-03 19:55
そちらの記事を読む場合はこちらも参照したほうがいいです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5187&forum=7

たしかdelegate関係のことも色々と議論されたはずなのですが……(かなり後ろのほうだったと思います)
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2005-08-03 20:24
「コンテキストを共有する」について。

たとえばあるライブラリ内で「外部リソースの取得/解放をライブラリ使用者に委譲したい」ケースを考えてみます。
その場合、ライブラリ使用者側で用意した「取得を行うメソッド」、「解放を行うメソッド」をライブラリからコールバックするために、あらかじめそれらのメソッドについてそれぞれdelegateで登録させるという設計もありえますが、取得/解放はライブラリからは常にセットで取り扱う(=コンテキストを共有する)ので以下のようなインターフェイスをライブラリ側で定義して
コード:
interface IResolver {
  IResource Get(string resourceId); // リソース取得
  void Release(IResource);          // リソース解放
}


これをライブラリ使用者に実装させる、というようなことだと思います。
(ちょっと例が悪いかもしれませんが…^^;)
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2005-08-03 20:42
私の場合、delegateとinterfaceの使い分けの基準は、
・オブジェクト単位で抽象化 --> interface
・メッセージ単位で抽象化 --> delegate
ですね。

オブジェクト単位で抽象化した結果、そのオブジェクトが1つしかメッセージ(メソッド)を持たない場合もありえます。

メッセージ単位の抽象化の例としては、DotNET Framework の MouseEventHandler デリゲートなどはマウスに関する各メッセージ(マウスを押下した、マウスを移動した、etc.)を抽象化したもの、と言えますね。

「メッセージもオブジェクトである」と考えれば、delegateなど使わずに全てinterfaceにするのもありだと思うのですが、オブジェクトの種類の増加を抑制するためにメッセージとして扱えるものはできるだけメッセージにするようにしています。
Tacchang
ベテラン
会議室デビュー日: 2004/09/05
投稿数: 55
お住まい・勤務地: 川崎市
投稿日時: 2005-08-04 10:11
餅宮餅喜さん、nak2kさん、ありがとうございました。
おかげさまで判った気がします。
報告を兼ねて,すでにお二人が述べてくれた表現と異なる表現をしてみます(自分の理解を確かめるために).
---
クラスの種類が増えることを防ぐため、ポリモルフィズムが必要ない(抽象クラスで依存されることがない/統一されたメソッド名が必要なく機能(メソッド)を持っていればよい)場合は、無理してinterfaceを作成するのではなく、delegateを検討すること
---

nak2kさんが紹介してくださった過去の議論はさらっと眺めましたが,参考になる箇所が沢山ありました.みなさん博識なので尊敬します.もうちょっと読み込んだり,文献を調べたりしてブラッシュアップしていきたいと思います.
1

スキルアップ/キャリアアップ(JOB@IT)