Скажімо, у мене є інтерфейс FooInterface
із таким підписом:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
І конкретний клас, ConcreteFoo
який реалізує цей інтерфейс:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Я хотів би ConcreteFoo::doSomething()
зробити щось унікальне, якщо він передається спеціальному типу SomethingInterface
об'єкта (скажімо, він називається SpecialSomething
).
Це, безумовно, порушення LSP, якщо я посилюю передумови методу або викидаю новий виняток, але чи все-таки це буде порушення LSP, якщо я створюю SpecialSomething
об'єкти зі спеціальним обкладинкою , забезпечуючи резервний варіант для загальних SomethingInterface
об'єктів? Щось на зразок:
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
об'єкт. Оскільки передумови та передумови залишаються однаковими, я не вважаю, що договір був порушений.