Скажімо, у мене є інтерфейс 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об'єкт. Оскільки передумови та передумови залишаються однаковими, я не вважаю, що договір був порушений.