Digamos que eu tenha uma interface FooInterfaceque tenha a seguinte assinatura:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
E uma classe concreta ConcreteFooque implementa essa interface:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Eu gostaria ConcreteFoo::doSomething()de fazer algo único se ele passou por um tipo especial de SomethingInterfaceobjeto (digamos que seja chamado SpecialSomething).
Definitivamente, é uma violação do LSP se eu fortalecer as condições prévias do método ou lançar uma nova exceção, mas ainda assim seria uma violação do LSP se eu fiz um caso especial de SpecialSomethingobjetos enquanto fornecia um substituto 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 seria a conversão de tipo paraSpecialSomething: se receberSpecialSomething, retornaria o objeto sem modificação, enquanto que, se receber umSomethingInterfaceobjeto genérico , executaria um algoritmo para convertê-lo em umSpecialSomethingobjeto. Como as pré-condições e pós-condições permanecem as mesmas, não acredito que o contrato tenha sido violado.