Angenommen, ich habe eine Schnittstelle FooInterface
mit 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 SomethingInterface
Objekttyp ü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 SpecialSomething
Objekte mit einem speziellen Gehäuse ausführe und gleichzeitig einen Fallback für generische SomethingInterface
Objekte 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 empfangenSpecialSomething
würde, würde sie das Objekt nur unverändert zurückgeben, während sie bei Empfang eines generischenSomethingInterface
Objekts einen Algorithmus ausführen würde, um es in einSpecialSomething
Objekt zu konvertieren . Da die Vor- und Nachbedingungen gleich bleiben, glaube ich nicht, dass der Vertrag verletzt wurde.