Mit dem Liskov-Substitutionsprinzip können Sie die Implementierungsvererbung im Grunde genommen nicht überbeanspruchen: Sie sollten die Vererbung niemals nur zur Wiederverwendung von Code verwenden (dafür gibt es eine Komposition)! Wenn Sie sich an LSP halten, können Sie ziemlich sicher sein, dass tatsächlich eine "Ist-Beziehung" zwischen Ihrer Oberklasse und Ihrer Unterklasse besteht.
Es heißt, dass Ihre Unterklassen alle Methoden der Unterklasse auf ähnliche Weise implementieren müssen wie die Methoden der Unterklasse. Sie sollten niemals eine Methode mit der Implementierung von NOP überschreiben oder null zurückgeben, wenn der Supertyp eine Ausnahme auslöst. Gemäß den Bedingungen von Design by Contract sollten Sie den Vertrag der Methode der Oberklasse einhalten, wenn Sie eine Methode überschreiben. Ein Weg, sich gegen das Brechen dieses Prinzips zu verteidigen, besteht darin, eine implementierte Methode niemals außer Kraft zu setzen. Extrahieren Sie stattdessen eine Schnittstelle und implementieren Sie diese Schnittstelle in beiden Klassen.
Das Prinzip der Grenzflächentrennung, das Prinzip der Einzelverantwortung und das Prinzip des hohen Koehsionsvermögens von GRASP hängen irgendwie zusammen. Sie beziehen sich auf die Tatsache, dass ein Unternehmen nur für eine Sache verantwortlich sein sollte, so dass es nur einen Grund für eine Änderung gibt, so dass eine Änderung sehr einfach durchgeführt werden kann.
Tatsächlich heißt es, dass eine Klasse, wenn sie eine Schnittstelle implementiert, alle Methoden dieser Schnittstelle implementieren und verwenden muss. Wenn es Methoden gibt, die in dieser bestimmten Klasse nicht benötigt werden, ist die Schnittstelle nicht funktionsfähig und muss in zwei Schnittstellen aufgeteilt werden, eine, die nur die von der ursprünglichen Klasse benötigten Methoden enthält. Es kann von einem POV aus betrachtet werden, das sich auf das vorherige Prinzip bezieht, indem es nicht zulässt, dass Sie große Schnittstellen erstellen, sodass deren Implementierung das LSP beschädigen kann.
Sie können die Abhängigkeitsinversion im Factory-Muster sehen. Hier hängen sowohl die übergeordnete Komponente (der Client) als auch die untergeordnete Komponente (die zu erstellende Einzelinstanz) von der Abstraktion ab(die Schnittstelle). Eine Möglichkeit, es in einer Schichtenarchitektur anzuwenden: Sie sollten keine Schnittstelle zu einer Schicht in der implementierten Schicht definieren, sondern in dem Modul, das aufgerufen wird. Beispielsweise sollte die API für die Datenquellenschicht nicht in die Datenquellenschicht geschrieben werden, sondern in die Business-Logikschicht, in der sie aufgerufen werden muss. Auf diese Weise erbt die Datenquellenschicht das in der Geschäftslogik definierte Verhalten (also die Inversion) und nicht umgekehrt (wie auf normale Weise). Dies bietet Flexibilität beim Entwurf, sodass die Geschäftslogik ohne Codeänderung mit einer anderen, völlig anderen Datenquelle funktioniert.