リスコフの置換原則(LSP)
リスコフの置換原則とは
- 派生クラスは、その基本クラスと置き換え可能でなければならない。継承関係を作成するためのガイドラインの集まり。
- でないとクライアントは、RTTI(キャスト)と条件分岐を使用して、その派生クラスのみ通る処理を用意しないといけないが、それは開放閉鎖の原則に違反することが多い。
- こちらも、インターフェース・ジェネリックを使用して、原則を守る。
経験則と約束事
- 基本クラスと派生クラスで置き換え可能にするため、派生クラスで事前条件の追加・事後条件の緩和を行わない。
- 事前条件とは入力値チェック、事後条件とは出力値チェック
- 不変条件は維持しなければならない。
- 基底クラスのコンストラクタ以降、値が読み取り専用のメンバ変数の場合、派生クラスでも引き継ぐ必要がある。
- 派生型の戻り値の型には共変性がなければならない
- 共変性:戻り値の型がクラス型の参照かポインタで、かつis-a関係にあるものは、戻り値が異なっていてもオーバーライド可能
- 派生型のメソッドの引数には反変性がなければならない。
- 反変性:引数の型がクラス型の参照かポインタで、かつis-a関係にあるものは、引数が異なっていてもオーバーライド可能
- 基本クラスで出来ていたことが、派生クラスで出来ないようになっていてはいけない
- 派生クラスで例外処理を追加してはいけない。(基本クラスよりも制約を増やしてはいけない)
結論
- 派生クラスで公開メソッドを追加しない。クライアント側で呼ばれると、基本クラスと置き換えできなくなるため。
- 派生クラスで例外処理を追加しない。基本クラスでは許可された動きが派生クラスで禁止されてしまうことになるため。 とりあえず、上記2点を意識すれば良いと思われる。
参考:
アジャイルソフトウェア開発の奥義