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
オブジェクトに変換します。前提条件と事後条件は同じままなので、契約に違反したとは思わない。