2005年09月27日

インターフェースと抽象クラスの使い分けについて

  
インターフェースと抽象クラスの使い分けについて質問されることがあります。
でも、一口に、「この場合は、インターフェースで、こういった場合は、抽象クラスを使うんだよ」とは言えないところがつらいですね。
「親子関係があって、子供の共通実装部分を定義したい時には、抽象クラスで、親子関係に縛られずに、共通の操作を決めたい時には、インターフェースだよ」、と言っても、じゃあ、自分が今抱えている問題にそれを当てはめようとしたときに、
すぐにこれだ、と思える例が出てこない。フレームワークを作成している人達は、そんなことはないのだろうけれど...

で、ググッてみたら、MSDN library のページ「抽象クラスとインターフェイスに関する推奨事項」にたどり着きました。

http://www.microsoft.com/japan/msdn/library/ja/Vbcon/html/vbconabstractclassesversusinterfaces.asp

そこには、こんな一文がありました。

小さな機能単位をデザインする場合は、インターフェイスを使用します。大きな機能単位をデザインする場合は、抽象クラスを使用します。

なるほどね、と思いました。実際に、.NET Framework はこの指針で設計されていますね。


この記事へのコメント
初めまして。
昔の記事へのコメント失礼いたします。

ふと立ち止まって考えると、抽象クラスとインターフェースを使い分けるべきか
悩み始めてしまいました。

機能の大小で分ける、、確かにそうですね。
自分が設計しているときも、無意識にそういう使い分けをしていそうです。

あとはやはり、"操作の公開!"というイメージが強いとインターフェース
と考えています。(表現が難しいですが・・)
Posted by 一ノ瀬七海 at 2006年12月26日 17:00
一ノ瀬七海さん、
コメントありがとうございます。
「操作の公開」はインターフェースという感覚はよく分かります。


僕は、たいていは、インターフェースを利用していますが、実装が進むにつれて、抽象クラスに変更することも多々あります。
つい最近も、インターフェースから、抽象クラスに変えました。

小さな機能で...Ableのような名前が付けられれば、悩まずにインターフェースなのですが、現実はそう簡単にいかないです。

継承使わずに、オブジェクトコンポジションを使え、ってのも考え方としては良くわかるのですが、委譲するまったく同じコードを、何回も書くことがわかっているんだったら、継承のほうがはるかに便利で間違いも少ないです。
Posted by Gushwell at 2006年12月26日 23:49
 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/50103500