Digamos que eu tenha uma interface FooInterface
que tenha a seguinte assinatura:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
E uma classe concreta ConcreteFoo
que 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 SomethingInterface
objeto (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 SpecialSomething
objetos enquanto fornecia um substituto 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 seria a conversão de tipo paraSpecialSomething
: se receberSpecialSomething
, retornaria o objeto sem modificação, enquanto que, se receber umSomethingInterface
objeto genérico , executaria um algoritmo para convertê-lo em umSpecialSomething
objeto. Como as pré-condições e pós-condições permanecem as mesmas, não acredito que o contrato tenha sido violado.