Il Principio di sostituzione di Liskov in sostanza non ti consente di abusare dell'ereditarietà dell'implementazione: non dovresti mai usare l'ereditarietà solo per il riutilizzo del codice (c'è una composizione per questo)! Aderendo a LSP, puoi essere abbastanza sicuro che esiste effettivamente una "relazione is-a" tra la tua superclasse e la tua sottoclasse.
Ciò che dice è che le sottoclassi devono implementare tutti i metodi della sottoclasse in modo simile all'implementazione dei metodi nella sottoclasse. Non si dovrebbe mai sostituire un metodo con l'implementazione di NOP o restituire null quando il supertipo genera un'eccezione; indicato in termini di Design by Contract, è necessario rispettare il contratto del metodo dalla superclasse quando si ignora un metodo. Un modo per difendersi dalla violazione di questo principio non è mai scavalcare un metodo implementato; estrarre invece un'interfaccia e implementare tale interfaccia in entrambe le classi.
Il principio di segregazione dell'interfaccia , il principio di responsabilità singola e il principio di alta coesione di GRASP sono in qualche modo correlati; si riferiscono al fatto che un'entità dovrebbe essere responsabile di una sola cosa, in modo che vi sia una sola ragione per il cambiamento, in modo che il cambiamento sia fatto molto facilmente.
In realtà dice che se una classe implementa un'interfaccia, allora deve implementare e usare tutti quei metodi dell'interfaccia. Se ci sono metodi che non sono necessari in quella particolare classe, allora l'interfaccia non è buona e deve essere suddivisa in due interfacce una che ha solo i metodi necessari per la classe originale. Può essere considerato da un POV, che si riferisce al principio precedente dal fatto che non consente di creare interfacce di grandi dimensioni in modo che la loro implementazione possa interrompere LSP.
È possibile vedere Inversion di dipendenza nel modello di fabbrica; qui sia il componente di alto livello (il client) che il componente di basso livello (istanza individuale da creare) dipendono dall'astrazione(l'interfaccia). Un modo per applicarlo in un'architettura a più livelli: non è necessario definire un'interfaccia per un livello nel livello implementato ma nel modulo chiamato. Ad esempio, l'API nel livello dell'origine dati non deve essere scritta nel livello dell'origine dati ma nel livello logico aziendale, dove deve essere chiamato. In questo modo, il livello dell'origine dati eredita / dipende dal comportamento definito nella logica aziendale (quindi l'inversione) e non viceversa (come sarebbe in modo normale). Ciò fornisce flessibilità nella progettazione, consentendo alla logica di business di funzionare senza alcuna modifica del codice, con un'altra fonte di dati completamente diversa.