しらとりのブログ

社会人ひよこプログラマのtil

継承の使いどころが難しい

機能自体を理解するのはそんなでもない継承ですが、使いこなすのはとても難しいと思った話。

コードを使いまわすための継承

同じコードを書いてはいけない。なので共通の処理を基底クラスに書いて継承させる。実装を継承させているパターンです。でもこれってコンポジション+転送のパターン(いわゆる委譲による継承パターン)で置き換えできそうですよね。

ポリモーフィズムのための継承

継承すると基底クラスの型に派生クラスのインスタンスを代入できるようになる。型を継承させているパターンです。基底クラスのメソッドをオーバーライドすることでインスタンスの型によって処理を変化させるポリモーフィズムを実現できます。しかし、これもインターフェースで置き換えできそうです。

継承を使用する方針

現状、実装の継承と型の継承を同時に行いたいときに継承を使用することにしています。動機がどちらか片方のみの場合は上記の方法で置き換えています。また、継承はどちらかというと型の継承に重きを置いている印象です。継承はis-a関係と言ったりしますが、継承を使用する客観的基準は結局のところリスコフの置換原則になるのだと思います。実装の継承はあくまでも開発者の負担を減らすもので、それを目的するのは避けたほうがよさそうです。