Digamos que tengo una interfaz FooInterfaceque tiene la siguiente firma:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Y una clase concreta ConcreteFooque 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 SomethingInterfaceobjeto (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 SpecialSomethingobjetos especiales al tiempo que proporciono una reserva para SomethingInterfaceobjetos 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 unSomethingInterfaceobjeto genérico , ejecutará un algoritmo para convertirlo en unSpecialSomethingobjeto. Como las condiciones previas y posteriores siguen siendo las mismas, no creo que se haya violado el contrato.