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