Diciamo che ho un'interfaccia FooInterface che ha la seguente firma:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
E una classe concreta ConcreteFoo che implementa tale interfaccia:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Mi piacerebbe ConcreteFoo::doSomething() di fare qualcosa di unico se ha passato un tipo speciale di oggetto SomethingInterface (diciamo che è chiamato SpecialSomething ).
È sicuramente una violazione LSP se rafforzo le precondizioni del metodo o lanci una nuova eccezione, ma sarebbe comunque una violazione LSP se ho oggetti SpecialSomething con casing speciale mentre fornisco un fallback per oggetti generici SomethingInterface ? Qualcosa come:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}