元ネタ:
@IT会議室 > Insider.NET 会議室 > インターフェイスによる継承と抽象化クラスによる継承の使い分け
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40953&forum=7&18
数日前のスレッドでいまさら感もありますが。
抽象化に抽象クラスを使うかインターフェイスを使うかって話なんですが、元の質問自体はいろいろな方々が回答されているので置いといて(ケースバイケースということもあるので…)、後でちょっと、調べたことを私なりにメモしておきます。
#上記スレッドでのdotnetmemoさんのご説明はわかりやすいです。
抽象クラスと派生クラスは「継承」の関係は"IS A"関係と呼ばれている対して、
インターフェイスと実装クラスの「実装」の関係は"CAN DO"関係と呼ばれているそうです。
抽象化に抽象クラスを使うかインターフェイスを使うかのガイドラインを私なりに箇条書き。
- 抽象クラスの方が実装クラスの実装者が楽できます。
- インターフェースは公開後に新しいメンバは追加できません。
やむ負えず機能変更する場合、実装クラスにそのメンバを実装してコンパイルが必要です。
- 値型(ValueTypeの派生)に機能を持たせたい場合は多重継承できないのでインターフェースを使います。
- 値型同様に既に別のクラスを継承している既存クラスへの汎用的機能追加の場合にはインターフェースを使います。
- 各実装クラスが状態の持ち方がほとんど同じであるなら、抽象クラスを使います。
- 両方使う場合もあります。インターフェース - 抽象クラス(スケルトン)- 実装クラスのようにする。
この場合、実装クラスの実装者が状況に応じて選択できます。
参考ページ:
MSDN2
Dr. GUI .NET 1.1 #2 > Interfaces
http://msdn2.microsoft.com/en-us/library/aa302308.aspx#drguinet2_update_topic5
のInterfaces vs. Abstract Base Classes
MSDN2
クラスまたはインターフェイスの選択(上記スレッドでNABEさんがはられていたリンク)
http://msdn2.microsoft.com/ja-jp/library/ms229013(VS.80).aspx
MSDN2
Recommendations for Abstract Classes vs. Interfaces
http://msdn2.microsoft.com/en-us/library/scsyfw1d(VS.71).aspx