FooInterface次のシグネチャを持つインターフェイスがあるとします。
interface FooInterface {
public function doSomething(SomethingInterface something);
}
そして、ConcreteFooそのインターフェースを実装する具体的なクラス:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
ConcreteFoo::doSomething()特別なタイプのSomethingInterfaceオブジェクトが渡された場合、ユニークな何かをしたいと思います(と呼ばれますSpecialSomething)。
メソッドの前提条件を強化するか、新しい例外をスローする場合、それは間違いなくLSP違反ですが、SpecialSomething汎用SomethingInterfaceオブジェクトのフォールバックを提供しながらオブジェクトを特別にケースに入れた場合でもLSP違反になりますか?何かのようなもの:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()メソッドの目的は型変換になりSpecialSomethingます:受け取っSpecialSomethingた場合、オブジェクトを変更せずに返しますが、汎用SomethingInterfaceオブジェクトを受け取った場合、アルゴリズムを実行してSpecialSomethingオブジェクトに変換します。前提条件と事後条件は同じままなので、契約に違反したとは思わない。