Diciamo che ho un'interfaccia FooInterfaceche ha la seguente firma:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
E una classe concreta ConcreteFooche implementa tale interfaccia:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Vorrei ConcreteFoo::doSomething()fare qualcosa di unico se viene passato un tipo speciale di SomethingInterfaceoggetto (diciamo che si chiama SpecialSomething).
È sicuramente una violazione di LSP se rafforzo i presupposti del metodo o lancio una nuova eccezione, ma sarebbe comunque una violazione di LSP se inserissi SpecialSomethingoggetti con casing speciale fornendo un fallback per SomethingInterfaceoggetti generici ? Qualcosa di simile a:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()metodo sarebbe la conversione del tipo inSpecialSomething: se lo riceveSpecialSomethingrestituirebbe l'oggetto non modificato, mentre se riceve unSomethingInterfaceoggetto generico eseguirà un algoritmo per convertirlo in unSpecialSomethingoggetto. Poiché le condizioni preliminari e postcondizioni rimangono le stesse, non credo che il contratto sia stato violato.