Pila extendiendo LinkedList. ¿Una violación del principio de sustitución de Liskov?

13

Existe una clase LinkedList con funciones como add_first (), add_last (), add_after (), remove_first (), remove_last () y remove ()

Ahora hay una pila de clase que proporciona funcionalidades como push (), pop (), peek () o top (), y para implementar estos métodos extiende los métodos de la clase LinkedList. ¿Es esto una violación del principio de sustitución de Liskov?

Por ejemplo, considere el caso add_after () para agregar un nodo en la enésima posición de una Lista Vinculada. Esto se puede hacer en la clase base pero no en la clase Pila. ¿Se están debilitando las condiciones posteriores o modificas el método add_after () para agregar a la parte superior de la pila?

Además, si no es una violación, ¿es este mal diseño? ¿Y cómo implementarías la funcionalidad de Pila usando la clase LinkedList?

    
pregunta jxvmiranda 13.12.2017 - 13:17

2 respuestas

31
  

Ahora hay una pila de clase que proporciona funcionalidades como push (), pop (), peek () o top (), y para implementar estos métodos extiende los métodos de la clase LinkedList. ¿Es esto una violación del principio de sustitución de Liskov?

No. Está perfectamente bien agregar métodos en un subtipo.

  

Por ejemplo, considere el caso add_after () para agregar un nodo en la enésima posición de una Lista Vinculada. Esto se puede hacer en la clase base pero no en la clase Stack.

Este es una violación del LSP. El LSP dice que las instancias de un subtipo deben ser sustituibles por las instancias de un supertipo sin cambiar las propiedades deseables de un programa. Si un subtipo elimina un método, cualquier código que llame a ese método se bloqueará (u obtendrá una excepción NoMethodError , o algo parecido). Claramente, "no estrellarse" es una propiedad deseable.

  

¿Se debilitan las condiciones posteriores o se modifica el método add_after () para agregar a la parte superior de la pila?

Modificar el método add_after() de esta manera es una violación de la Regla de historial (¡la más importante de las reglas!) y, por lo tanto, no ayuda a corregir la violación del LSP.

  

¿Y cómo implementarías la funcionalidad de Pila usando la clase LinkedList?

Usando la composición.

NOTA: ¡Todo lo que escribí anteriormente solo se aplica a los idiomas que confunden los subtipos y las subclases! El LSP se trata de subtipos , no de subclases. En un idioma que no confunda a los dos, sería perfectamente aceptable hacer que Stack sea una subclase de LinkedList , siempre que no lo haga un subtipo de LinkedList .

    
respondido por el Jörg W Mittag 13.12.2017 - 13:43
1

Ya que todo fue abordado por Jörg W Mittag, acabo de elaborar un poco sobre la siguiente parte:

  

¿Se están debilitando las condiciones posteriores o se modifica la   ¿Método add_after () para agregar a la parte superior de la pila?

Básicamente, cuando hay una pregunta sobre si alguna jerarquía viola el LSP, depende de qué contrato posea. Entonces, ¿qué contrato tiene add_after ? Si suena, por loco que sea, como "Agregar un nodo en la posición n-ésima o en la parte superior", lo que está bien, se cumple la condición posterior, no se viola el LSP. De lo contrario es una violación de LSP.

    
respondido por el Zapadlo 13.12.2017 - 15:02