El principio de sustitución de Liskov hace referencia a la letra L en los principios SOLID. ¿A qué se refiere este en el desarrollo de software?
Este principio nos dice básicamente que los sub tipos deberían poder sustituirse por sus tipos base. Esto podemos verlo representado con la herencia como X cosa es Y cosa.
Comúnmente podemos ver estos ejemplos como animales, figuras, etc. Algo así como “un pato es un ave”, así que “un pato es sustituible por ave”.

Un cuadrado y un rectángulo son cuadriláteros, pero el cuadrado es y debe ser igual en todas sus partes.
¿Cómo podemos identificar violaciones a este principio?
- Si utilizamos “is” o “as” para ejecutar alguna implementación en concreto, si nuestro código es polimorfico debería funcionar con un tipo u otro. En estos casos sería mejor encapsular estas funcionalidades en sus tipos e invocar desde allí.
- Probablemente si utilizamos null checks para realizar nuestras validaciones. Sería mejor minimizar estos y en su lugar usar tipos nulleables, condicionales, coalescing o guard clauses.
- NotImplementedException. Básicamente nos está diciendo que nuestro objeto no cumple al 100% con las implementaciones que debería por lo que no siempre será sustituible. Si esto debe ser así tal vez deberías re plantear estas implementaciones.
Eso sería todo por este principio, espero te sea de ayuda a re analizar parte de tus desarrollos o explorar más acerca del mismo.