Disons que j'ai une interface FooInterfacequi a la signature suivante:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Et une classe concrète ConcreteFooqui implémente cette interface:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
J'aimerais ConcreteFoo::doSomething()faire quelque chose d'unique s'il passe un type d' SomethingInterfaceobjet spécial (disons qu'il s'appelle SpecialSomething).
C'est définitivement une violation LSP si je renforce les conditions préalables de la méthode ou si je lève une nouvelle exception, mais serait-ce toujours une violation LSP si je casse des SpecialSomethingobjets spéciaux tout en fournissant une solution de secours pour les SomethingInterfaceobjets génériques ? Quelque chose comme:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()méthode serait de convertir le type enSpecialSomething: si elle le recevait,SpecialSomethingelle retournerait simplement l'objet non modifié, tandis que si elle recevait unSomethingInterfaceobjet générique , elle exécuterait un algorithme pour le convertir enSpecialSomethingobjet. Étant donné que les conditions préalables et postconditions restent les mêmes, je ne pense pas que le contrat ait été violé.