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

MSDNには非常に多くのことがかかれていて、単なるリファレンスだけではなく、より一般的な知識を提供してくれる点もおおい

たとえば、抽象クラスとインターフェイスに関する推奨事項では以下のような内容が記述されています。

  • コンポーネントの複数のバージョンを作成する場合は、抽象クラスを作成します。抽象クラスは、コンポーネントをバージョン管理するための単純で簡単な方法を提供します。基本クラスを更新することにより、すべての継承クラスに自動的に変更が反映されます。一方、インターフェイスは、いったん作成した後は変更できません。インターフェイスの新しいバージョンが必要な場合は、まったく新しいインターフェイスを作成する必要があります。
  • 幅広い範囲の種類の異なるオブジェクトで利用できる機能を作成する場合は、インターフェイスを使用します。抽象クラスは主に、互いに密接な関係を持つオブジェクトに対して使用します。一方インターフェイスは、互いに関連性のないクラスに対して共通の機能を提供する場合に最も適しています。
  • 小さな機能単位をデザインする場合は、インターフェイスを使用します。大きな機能単位をデザインする場合は、抽象クラスを使用します。
  • コンポーネントのすべての実装に対して共通の実装済み機能を提供する場合は、抽象クラスを使用します。抽象クラスではクラスを部分的に実装できますが、インターフェイスにはメンバの実装は含まれません。

このような基本的な問いかけ、なかなか難しいですよね。