Допустим, у меня есть интерфейс, 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объект. Поскольку предварительные условия и постусловия остаются прежними, я не верю, что контракт был нарушен.