Both sides previous revisionPrevious revisionNext revision | Previous revision |
wiki:psl [2024/08/30 08:32] – admin | wiki:psl [2024/08/30 08:34] (current) – admin |
---|
Supongamos que las subclases ''B1'', ''B2'', …, ''Bn'' redefinen el método ''g()'' de ''A'', que es un método llamado en el cuerpo de ''f''. El Principio de Sustitución de Liskov prescribe que estas redefiniciones no pueden violar el contrato de la implementación original de ''g'' en ''A''. | Supongamos que las subclases ''B1'', ''B2'', …, ''Bn'' redefinen el método ''g()'' de ''A'', que es un método llamado en el cuerpo de ''f''. El Principio de Sustitución de Liskov prescribe que estas redefiniciones no pueden violar el contrato de la implementación original de ''g'' en ''A''. |
| |
**Ejemplo 1**: Supongamos una clase base que calcula números primos. Supongamos también algunas subclases que implementan otros algoritmos con el mismo propósito. Específicamente, el método getPrimo(n) es un método que devuelve el enésimo número primo. Este método existe en la clase base y se redefine en todas las subclases. | **Ejemplo 1**: Supongamos una clase base que calcula números primos. Supongamos también algunas subclases que implementan otros algoritmos con el mismo propósito. Específicamente, el método ''getPrimo(n)'' es un método que devuelve el enésimo número primo. Este método existe en la clase base y se redefine en todas las subclases. |
| |
Supongamos además que el contrato del método ''getPrimo(n)'' especifique lo siguiente: //1 <= n <= 1 millón//. Es decir, el método debe ser capaz de devolver cualquier número primo para //n// variando de //1 hasta 1 millón//. En este ejemplo, una posible violación del contrato de ''getPrimo(n)'' ocurre, por ejemplo, si en una de las clases el algoritmo implementado calcula solo números primos hasta //900 mil//. | Supongamos además que el contrato del método ''getPrimo(n)'' especifique lo siguiente: $1 <= n <= 1 millón$. Es decir, el método debe ser capaz de devolver cualquier número primo para //n// variando de //1 hasta 1 millón//. En este ejemplo, una posible violación del contrato de ''getPrimo(n)'' ocurre, por ejemplo, si en una de las clases el algoritmo implementado calcula solo números primos hasta //900 mil//. |
| |
De manera más concreta, el Principio de Sustitución de Liskov define lo siguiente: supongamos que un cliente llama a un método ''getPrimo(n)'' de un objeto p de la clase ''NumeroPrimo''. Supongamos ahora que el objeto ''p'' es reemplazado por un objeto de una subclase de ''NumeroPrimo''. En este caso, el cliente comenzará a ejecutar el método ''getPrimo(n)'' de esa subclase. Sin embargo, esta sustitución de métodos no debe afectar el comportamiento del cliente. Para ello, todos los métodos ''getPrimo(n)'' de las subclases de NumeroPrimo deben realizar las mismas tareas que el método original, posiblemente de manera más eficiente. | De manera más concreta, el Principio de Sustitución de Liskov define lo siguiente: supongamos que un cliente llama a un método ''getPrimo(n)'' de un objeto p de la clase ''NumeroPrimo''. Supongamos ahora que el objeto ''p'' es reemplazado por un objeto de una subclase de ''NumeroPrimo''. En este caso, el cliente comenzará a ejecutar el método ''getPrimo(n)'' de esa subclase. Sin embargo, esta sustitución de métodos no debe afectar el comportamiento del cliente. Para ello, todos los métodos ''getPrimo(n)'' de las subclases de NumeroPrimo deben realizar las mismas tareas que el método original, posiblemente de manera más eficiente. |