Diyelim ki FooInterfaceaşağıdaki imzayı içeren bir arayüzüm var:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Ve ConcreteFoobu arayüzü uygulayan somut bir sınıf :
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
ConcreteFoo::doSomething()Özel bir SomethingInterfacenesne 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 SpecialSomethinggenel SomethingInterfacenesneler 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 birSomethingInterfacenesne 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.