Principio de sustitución de Liskov
# Principio de sustitución de Liskov

Principio de sustitución de Liskov o LSP (Liskov Substitution Principle) es un principio de la programación orientada a objetos. y puede definirse como: Cada clase que hereda de otra puede usarse como su padre sin necesidad de conocer las diferencias entre ellas.

## Definición

En lenguaje más formal: si S es un subtipo de T, entonces los objetos de tipo T en un programa de computadora pueden ser sustituidos por objetos de tipo S (es decir, los objetos de tipo S pueden sustituir objetos de tipo T), sin alterar ninguna de las propiedades deseables de ese programa (la corrección, la tarea que realiza, etc.). Más formalmente, el LSP (Liskov Substitution Principle) es una definición particular de una relación de subtipificación, llamada tipificación (fuerte) del comportamiento, que fue introducido inicialmente por Barbara Liskov en una conferencia magistral en 1987 titulada La Abstracción de Datos y Jerarquía. Se refiere más a una relación semántica que a una relación sintáctica, ya que sólo tiene la intención de garantizar la interoperabilidad semántica de tipos en una jerarquía, los tipos de objeto en particular. Liskov y Jeannette Wing formularon el principio de manera conjunta en un artículo en el año 1994 de la siguiente manera:

   Sea ϕ(x) una propiedad comprobable acerca de los objetos x de tipo T. Entonces ϕ(y) debe ser verdad para los objetos y del tipo S, donde S es un subtipo de T.

## Precondiciones, postcondiciones e invariantes

En el mismo artículo, Liskov y Wing detallan que su concepto de comportamiento de subtipos es una extensión de la lógica de Hoare, que tiene una cierta semejanza con el diseño por contrato de Bertrand Meyer, ya que considera la interacción de subtipos con precondiciones, postcondiciones e invariantes:

* Las precondiciones no pueden ser reforzadas por un subtipo.
* Las postcondiciones no pueden ser debilitadas por un subtipo.
* Las invariantes establecidas por el supertipo deben ser mantenidas por los subtipos.
* La Restricción histórica (O Regla histórica). Se acepta normalmente que los objetos deben ser modificados únicamente a través de sus métodos (Encapsulamiento). Como los subtipos pueden introducir nuevos métodos, ausentes en el supertipo, estos podrían cambiar el estado interno del objeto en formas que serían imposibles o inadmisibles en el supertipo. La restricción histórica impide este tipo de modificaciones. Este fue el elemento novedoso introducido por Liskov y Wing. Se puede ejemplificar una violación de este principio definiendo un subtipo PuntoMutable como descendiente de un supertipo PuntoInmutable. Esto resulta en una violación del principio histórico, porque en la historia de un objeto de tipo PuntoInmutable, el estado es siempre el mismo desde su creación, por lo que no puede incluir la historia de un PuntoMutable. Sin embargo, campos extra añadidos en un subtipo podrían ser modificables sin problema, porque estos campos no son observables desde los métodos del supertipo. Así que se podría, por ejemplo, derivar un tipo Círculo con un centro fijo pero un radio variable a partir de un tipo PuntoInmutable sin violar LSP.
