Digamos que tengo una interfaz FooInterface
que tiene la siguiente firma:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Y una clase concreta ConcreteFoo
que implementa esa interfaz:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Me gustaría ConcreteFoo::doSomething()
hacer algo único si se pasa un tipo especial de SomethingInterface
objeto (digamos que se llama SpecialSomething
).
Definitivamente es una violación de LSP si fortalezco las condiciones previas del método o lanzo una nueva excepción, pero ¿seguiría siendo una violación de LSP si coloco SpecialSomething
objetos especiales al tiempo que proporciono una reserva para SomethingInterface
objetos genéricos ? Algo como:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()
método sería la conversión de tipo aSpecialSomething
: si lo recibeSpecialSomething
, simplemente devolverá el objeto sin modificar, mientras que si recibe unSomethingInterface
objeto genérico , ejecutará un algoritmo para convertirlo en unSpecialSomething
objeto. Como las condiciones previas y posteriores siguen siendo las mismas, no creo que se haya violado el contrato.