Let's say I have an interface FooInterface
that has the following signature:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
And a concrete class ConcreteFoo
that implements that interface:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
I'd like to ConcreteFoo::doSomething()
to do something unique if it's passed a special type of SomethingInterface
object (let's say it's called SpecialSomething
).
It's definitely a LSP violation if I strengthen the preconditions of the method or throw a new exception, but would it still be an LSP violation if I special-cased SpecialSomething
objects while providing a fallback for generic SomethingInterface
objects? Something like:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}