Disons que j'ai une interface FooInterface
qui a la signature suivante:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Et une classe concrète ConcreteFoo
qui 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' SomethingInterface
objet 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 SpecialSomething
objets spéciaux tout en fournissant une solution de secours pour les SomethingInterface
objets 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,SpecialSomething
elle retournerait simplement l'objet non modifié, tandis que si elle recevait unSomethingInterface
objet générique , elle exécuterait un algorithme pour le convertir enSpecialSomething
objet. Étant donné que les conditions préalables et postconditions restent les mêmes, je ne pense pas que le contrat ait été violé.