argius note

プログラミング関連

継承の代わりにinterfaceを使う方法と利点

以下、頭の中の情報*1をまとめたもの。
継承は再利用のためにあるのではなく、抽象化のためにある。正にabstractな訳だ。ただ、最近のJavaでは抽象化をinterfaceだけで行う方が一般的だ。機能を受け継ぎたい場合は、委譲を使う*2。但し、操作の多いinterfaceの委譲を記述するのは、IDEがないと非常に面倒だ。
例えば、java.sql.ResultSetの実装クラスを書いてみよう。IDEがあっても面倒なことうけあいである。DBMSベンダーによる実装では、ResultSetの実装抽象クラスを何層かに分けて実装する。AbstractResultSet1,AbstractResultSet2...のように。1では、レコードへのアクセスを実装し、2では、型の変換を実装する、など機能の層を分ける。
多重継承も、同様にして実装する。Readable,Writableというinterfaceを両方実装するクラスは、読み込みも書き込みもできる。使う側としては、Readableだけで良い場合もある。両方の操作が要求されることを想定するならば、Readable,Writableを両方継承したinterface"Stream"を定義する。Streamはreadメソッドもwriteメソッドも両方使える。
interfaceを使うことで得られる恩恵とは、主に「疎結合」だ。interfaceを実装するクラスと使用するクラスが、直接結びつくことを避けることで、クラスの依存関係を断ち切ることができ、これによって柔軟なプログラミングが可能になる。interfaceさえ変わらなければ*3、どちらのクラスもどんな修正にも耐えられるのだ。

*1:自分で考えたわけではなく、集めたもの。

*2:RubyのModuleのような概念があったら重宝しただろうか。

*3:変えなくて済むような上手い設計をするのはとても難しいが。