Diyelim ki FooInterface
aşağıdaki imzayı içeren bir arayüzüm var:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Ve ConcreteFoo
bu arayüzü uygulayan somut bir sınıf :
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
ConcreteFoo::doSomething()
Özel bir SomethingInterface
nesne türünden geçtiyse benzersiz bir şey yapmak istiyorum (diyelim ki çağrılıyor SpecialSomething
).
Yöntemin önkoşullarını güçlendirirsem veya yeni bir istisna atarsam kesinlikle bir LSP ihlalidir, ancak SpecialSomething
genel SomethingInterface
nesneler için bir geri dönüş sağlarken nesneleri özel olarak kaplarsam yine de bir LSP ihlali olur mu? Gibi bir şey:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()
yöntemin amacı şuna dönüşüm türünü kullanmaktırSpecialSomething
: eğer alırsaSpecialSomething
, nesneyi değiştirmeden geri döndürürken, genel birSomethingInterface
nesne alırsa nesneyi dönüştürmek için bir algoritma çalıştırırSpecialSomething
. Ön koşullar ve son koşullar aynı kaldığından, sözleşmenin ihlal edildiğine inanmıyorum.