【オブジェクト指向のこころ】14章 抽象クラス vs インタフェース

デザインパターンとともに学ぶオブジェクト指向のこころ」の学習記録。
「第14章 デザインパターンの原則と戦略」のまとめ。

抽象クラス

  • 抽象クラスには共通する状態と振る舞いを保持できる。
  • つまり、すべての派生クラスに共通する状態や振る舞いがあるのであれば、それを抽象クラスに保持しておくことができる。
  • ただしJavaは単一継承言語のため、抽象クラスの使用は必要のある場合のみにとどめるべき。

ポリモーフィズムの観点で考えると、、

  • 抽象クラスは関連する実体をまとめるための手段である。
  • 具体的なもの(派生クラス)を同じように使用するためにはどのように設計すべきか、ということに着目する。
  • 言い換えれば、どのように実装を抜き出してカプセル化するか、ということ。
  • サービスオブジェクト(実装)に着目し、それを使用するオブジェクトが実装に特化した詳細と結合しないよう、サービスオブジェクトの抽象化方法を考えるということ。

インタフェース

同じ方法をインタフェースで考えると、、

  • こういったものを同じ方法で使用するには、どういったインタフェースが必要なんだろう?という疑問を抱くことになる。
  • 派生物や実装を使用することになるオブジェクトを中心に捉えて考える。
  • コンテキスト/制御オブジェクトとうまく連携するには、どういったインタフェースがサービスオブジェクトに必要なのだろうか?という視点で考える。
  • 使用する側のオブジェクトがさまざまな種類のオブジェクトを必要としている、つまり複数の抽象的側面が存在する場合、それぞれの種類のオブジェクト毎にインタフェースが洗い出される。
  • その結果、インタフェースはずっと簡潔に、スリムになる。

まとめ

インタフェースの方が抽象クラスより優れているということにはならない。

  • インタフェースを洗い出した後、そのインタフェースを実装した抽象クラスを定義することもある。
  • 抽象クラスにはデフォルトの振る舞いを定義することができるため、クラスの実装を簡潔にし、保守性を高めることができる。

まとめると、、

  • 共通する状態/振る舞いを持ったオブジェクトは抽象クラスから派生させる。
  • 状態/振る舞いを直接共有しない、またはその他の理由で別なクラスから派生する必要があるオブジェクトはインタフェースを実装する。