リスコフの置換原則
出典: フリー百科事典『ウィキペディア(Wikipedia)』
リスコフの置換原則(りすこふのちかんげんそく、英: Liskov substitution principle)とは、オブジェクト指向プログラミングにおける派生型の定義の一種であり、1993年、バーバラ・リスコフと Jeannette Wing が論文 Family Values: A Behavioral Notion of Subtyping で提唱した[1]。なお、これが派生型の唯一の定義ではない(データ型参照)。
この原則は、次のように簡潔に定式化されている[2]:
- T 型のオブジェクト x に関して真となる属性を q(x) とする。このとき S が T の派生型であれば、S 型のオブジェクト y について q(y) が真となる。
すなわち、リスコフと Wing が定式化した派生型の定義は、「置換可能性; substitutability」に基づいている。S が T の派生型であれば、プログラム内で T 型のオブジェクトが使われている箇所は全て S 型のオブジェクトで置換可能であり、それによってプログラムの動作は全く変化しない(正当性参照)。
[編集] 契約プログラミング
リスコフの置換原則は契約プログラミングの方法論と密接に関連しており、契約と継承の相互作用に次のような制約をもたらす:
- 事前条件を派生型で強めることはできない。つまり、上位の型よりも強い事前条件を持つ派生型を作ることはできない。
- 事後条件を派生型で弱めることはできない。つまり、上位の型よりも弱い事後条件を持つ派生型を作ることはできない。
さらに、この原則によれば、派生型のメソッドが発生する例外は、上位の型のメソッドが発生する例外の派生型か、上位のメソッドの例外と同じものでなければならない。共変化と逆変化を参照されたい。
この原則に違反しているクラス階層では、基底クラスへの参照を使い、派生クラスに関する知識を持たなければならなくなる。このようなコードは開放/閉鎖原則にも違反し、新たな派生クラスを追加するたびに全体のコードを修正しなければならなくなる。
[編集] 参考文献
- ^ Liskov, Barbara; Wing, Jeannette (1993年7月16日). "Family Values: A Behavioral Notion of Subtyping" 2006-10-05閲覧.
- ^ Liskov, Barbara; Wing, Jeannette (1999年7月). "Behavioral Subtyping Using Invariants and Constraints" (PS) 2006-10-05閲覧.