読書記録 C#実践開発手法 第2部-第7章

知らぬ間に1月過ぎておりました。
しかしひとまずは継続しているのでセーフです。

さて本日は、第7章のリスコフの置換原則の説明になります。
リスコフの置換原則は、クラスにおけるコントラクト(契約)の話に深く根付いており
非常に重要な原則だと思いますが、一見した時に全容がつかみにくい印象があります。

定義と伝えたいこと

定義としては
「SがTの派生形であるとすれば、T型のオブジェクトをS型のオブジェクトと置き換えたとしても、プログラムは動作し続けるはずである。」
というものです。
ここでは、プログラムが"動作する"ことが重要であって"期待する結果と一致する"ことは求めていません。
具体的には、コンパイルがエラーなく終了し、動作途中でアプリケーションの強制終了が発生しないようにすることが重要になります。

この定義が伝えたいことは、クラスのコントラクトのルールとして

  • 事前条件を派生型で強化することはできない
  • 事後条件は派生型で緩和することはできない
  • 基底型の不変条件は派生型でも維持されなければならない

これらのルールは、引数と戻り値の型の変性に関係しており、派生型は

  • 事前条件を強めてはいけない
  • 事後条件を弱めてはいけない
  • 基底型が知らない例外を投げてはいけない

というものになります。つまり、派生型は基底型が要求しない引数を持たず、出力しない戻り値を出力してはいけないということになります。
ただし、基底型の引数や戻り値の型が派生型のそれを包含しているのは問題ありません。

ここまでは入出力に関するものでしたが、内部で保持している値やその型の不変条件も維持することになります。

少し短いですが今回はこれまでとしておきます。
次回はインタフェース依存に関する内容になります。
更新予定日は7/6としておきます。