基本メソッドで定義された動作を変更すると、オーバーライドすると Liskov Substitution Principle が破られます。つまり、次のことを意味します。
- 子メソッドの最も弱い前提条件は、基本メソッドの前提条件より強くしてはなりません。
- 子メソッドの事後条件は、親メソッドの事後条件を意味します。事後条件は、a) メソッドの実行によって引き起こされるすべての副作用、および b) 返された式の型と値によって形成されます
。
これら 2 つの要件から、スーパー メソッドから期待されるものに影響を与えない子メソッドの新しい機能は、原則に違反しないことを暗示できます。これらの条件により、スーパークラス インスタンスが必要な場合にサブクラス インスタンスを使用できます。
これらの規則に従わない場合、クラスは LSP に違反します。古典的な例は次のような階層です: class Point(x,y)
、ColoredPoint(x,y,color)
拡張され、メソッドをPoint(x,y)
オーバーライドし、色による等価性を反映するクラス。のインスタンスがあれば、同じ座標を持つ 2 つの点がこのセットで等しいと仮定できます。これはオーバーライドされたメソッドには当てはまりません。一般に、インスタンス化可能なクラスを拡張し、LSP を壊さずにメソッドで使用されるアスペクトを追加する方法はありません。equals(obj)
ColoredPoint
Set<Point>
equals
equals
したがって、この原則を破るたびに、潜在的なバグが暗黙のうちに導入され、コードによって期待される親クラスの不変条件が満たされない場合に明らかになります。ただし、現実の世界では、LSP に違反しない明確な設計ソリューションがないことが多いため、たとえば、@ViolatesLSP
クラス アノテーションを使用して、クラス インスタンスをポリモーフィック セットまたはその他の種類で使用するのは安全ではないことをクライアントに警告できます。 Liskov 置換原理に依存するケースの。