¿El Principio de sustitución de Liskov también se aplica a las clases que implementan una interfaz?

17

LSP establece que las clases deberían ser sustituibles por sus clases base, lo que significa que las clases derivadas y base deberían ser semánticamente equivalentes.

Pero, ¿LSP también se aplica a las clases que implementan una interfaz? En otras palabras, si un método de interfaz implementado por una clase es semánticamente diferente de lo que el usuario espera que sea, ¿se consideraría una violación del LSP?

usuario1483278
fuente
77
Si. Exactamente las mismas razones y resultados que violar LSP si es una interfaz, una clase abstracta, una clase completa, no importa. LSP se trata de establecer y cumplir con las expectativas para permitir que los consumidores traten a sus tipos de manera general.
Jimmy Hoffa
55
En general (sé las diferencias, pero estoy generalizando aquí), las interfaces son algo análogas a las clases abstractas puras (término C ++) y, por lo tanto, Liskov debería aplicarse a las interfaces y a las clases que las implementan.
Jesse C. Slicer
3
Nota: la formulación del LSP con la que estoy familiarizado habla de subtipos en lugar de clases derivadas y básicas. Con razón, supongo, porque ninguna de las razones es específica de la herencia y se aplica igualmente a cualquier otro tipo de subtipo.

Respuestas:

17

Si un método de interfaz implementado por una clase es semánticamente diferente de lo que el usuario espera que sea, ¿se consideraría una violación de LSP?

Si la implementación es semánticamente diferente del comportamiento documentado a través de los invariantes de la interfaz y las condiciones previas y posteriores de sus métodos, entonces la respuesta es "sí", sería una violación del LSP. El principio establece las reglas para la abstracción y sus implementaciones, sin requerir que el lado de la abstracción esté presente en forma de clase.

Sin embargo, si hablamos de lo que los usuarios esperan , la respuesta sería "no necesariamente": los usuarios tienen derecho a tener expectativas equivocadas.

dasblinkenlight
fuente
"Si la implementación es semánticamente diferente del comportamiento documentado a través de los invariantes de la interfaz" ¿Podría explicar qué quiere decir con "invariantes de la interfaz"?
usuario1483278
3
@ user1483278 Aquí hay un artículo sobre invariantes de tipo . El artículo los llama "invariantes de clase", pero la descripción también se aplica a las interfaces. Las invariantes son condiciones que se establecen en la construcción y se mantienen durante toda la vida útil de una instancia. Por ejemplo, si una interfaz tiene una propiedad Nameque no se puede establecer en null, entonces obj.Name != nullse dice que es una invariante de esa interfaz.
dasblinkenlight
1
Normalmente, cuando se discuten los invariantes, es posible escribir un código para verificar que el invariante se mantiene durante toda la vida útil del objeto. Sin embargo, generalmente es más sencillo describir verbalmente la invariante en inglés simple.
rwong