リスコフの置換原則

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Jump to navigation Jump to search

リスコフの置換原則(りすこふのちかんげんそく、: Liskov substitution principle)は、型システムなどにおける型の派生に関する議論において、派生元の型(基底型)と派生先の型(派生型)の間に成り立っていなければならない規則性で、1993年、バーバラ・リスコフジャネット・ウィング英語版 が論文 Family Values: A Behavioral Notion of Subtyping で示した[1]

次のように簡潔に定式化される[2]:

型のオブジェクト に関して真となる属性を とする。このとき の派生型であれば、 型のオブジェクト について が真となる。

すなわち、置換可能性 (substitutability ) ということである。S が T の派生型であれば、プログラム内で T 型のオブジェクトが使われている箇所は全て S 型のオブジェクトで置換可能であれ、ということで、この原則が損なわれなければ、プログラムの型システムに照らした妥当性は損なわれない、ということである。

オブジェクト指向プログラミングでは、サブクラスとスーパークラス(基底クラスと派生クラス)の間の関係ということになる。

契約プログラミング[編集]

リスコフの置換原則は契約プログラミングの方法論と密接に関連しており、契約と継承の相互作用に次のような制約をもたらす:

  • 事前条件を派生型で強めることはできない。つまり、上位の型よりも強い事前条件を持つ派生型を作ることはできない。
  • 事後条件を派生型で弱めることはできない。つまり、上位の型よりも弱い事後条件を持つ派生型を作ることはできない。

さらに、この原則によれば、派生型のメソッドが発生する例外は、上位の型のメソッドが発生する例外の派生型か、上位のメソッドの例外と同じものでなければならない。共変性と反変性も参照。

この原則に違反しているクラス階層では、基底クラスへの参照を使い、派生クラスに関する知識を持たなければならなくなる。このようなコードは開放/閉鎖原則にも違反し、新たな派生クラスを追加するたびに全体のコードを修正しなければならなくなる。

引用[編集]

参考文献[編集]