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
}
}
}