Angenommen, ich habe eine Schnittstelle FooInterfacemit der folgenden Signatur:
interface FooInterface {
public function doSomething(SomethingInterface something);
}
Und eine konkrete Klasse ConcreteFoo, die diese Schnittstelle implementiert:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
}
}
Ich möchte ConcreteFoo::doSomething()etwas Einzigartiges tun, wenn es einem bestimmten SomethingInterfaceObjekttyp übergeben wird (sagen wir, es heißt SpecialSomething).
Es ist definitiv eine LSP-Verletzung, wenn ich die Voraussetzungen der Methode verbessere oder eine neue Ausnahme auslöse. Wäre es dennoch eine LSP-Verletzung, wenn ich SpecialSomethingObjekte mit einem speziellen Gehäuse ausführe und gleichzeitig einen Fallback für generische SomethingInterfaceObjekte bereitstelle ? So etwas wie:
class ConcreteFoo implements FooInterface {
public function doSomething(SomethingInterface something) {
if (something instanceof SpecialSomething) {
// Do SpecialSomething magic
}
else {
// Do generic SomethingInterface magic
}
}
}
doSomething()Methode die Typkonvertierung inSpecialSomething: Wenn sie empfangenSpecialSomethingwürde, würde sie das Objekt nur unverändert zurückgeben, während sie bei Empfang eines generischenSomethingInterfaceObjekts einen Algorithmus ausführen würde, um es in einSpecialSomethingObjekt zu konvertieren . Da die Vor- und Nachbedingungen gleich bleiben, glaube ich nicht, dass der Vertrag verletzt wurde.