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) {
}
}
Vorrei ConcreteFoo::doSomething()
fare qualcosa di unico se viene passato un tipo speciale di SomethingInterface
oggetto (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 SpecialSomething
oggetti con casing speciale fornendo un fallback per SomethingInterface
oggetti 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 riceveSpecialSomething
restituirebbe l'oggetto non modificato, mentre se riceve unSomethingInterface
oggetto generico eseguirà un algoritmo per convertirlo in unSpecialSomething
oggetto. Poiché le condizioni preliminari e postcondizioni rimangono le stesse, non credo che il contratto sia stato violato.