This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
wiki:psl [2024/08/26 00:47] – created admin | wiki:psl [2024/08/30 08:34] (current) – admin | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Principio de Sustitución de Liskov ====== | ====== Principio de Sustitución de Liskov ====== | ||
+ | |||
+ | Como ya discutimos al hablar del principio " | ||
+ | |||
+ | El Principio de Sustitución de Liskov especifica reglas para la redefinición de métodos de clases base en clases derivadas. El nombre del principio hace referencia a Barbara Liskov, profesora del MIT y ganadora de la edición de 2008 del Premio Turing. Entre otros trabajos, Liskov desarrolló investigaciones sobre sistemas de tipos para lenguajes orientados a objetos. En uno de esos trabajos, enunció el principio que luego recibió su nombre. | ||
+ | |||
+ | Para explicar el Principio de Sustitución de Liskov, nos basaremos en el siguiente ejemplo: | ||
+ | |||
+ | <code java> | ||
+ | void f(A a) { | ||
+ | ... | ||
+ | a.g(); | ||
+ | ... | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | El método '' | ||
+ | |||
+ | |||
+ | <code java> | ||
+ | f(new B1()); | ||
+ | ... | ||
+ | f(new B2()); | ||
+ | ... | ||
+ | f(new B3()); | ||
+ | </ | ||
+ | |||
+ | El Principio de Sustitución de Liskov determina las condiciones — semánticas y no sintácticas — que las subclases deben cumplir para que un programa como el anterior funcione correctamente. | ||
+ | |||
+ | Supongamos que 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, | ||
+ | |||
+ | Supongamos además que el contrato del método '' | ||
+ | |||
+ | De manera más concreta, el Principio de Sustitución de Liskov define lo siguiente: supongamos que un cliente llama a un método '' | ||
+ | |||
+ | **Ejemplo 2**: Vamos a mostrar un segundo ejemplo de violación, esta vez bastante evidente, para reforzar el concepto del Principio de Sustitución de Liskov. | ||
+ | |||
+ | <code java> | ||
+ | class A { | ||
+ | int suma(int a, int b) { | ||
+ | return a+b; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | class B extends A { | ||
+ | |||
+ | int suma(int a, int b) { | ||
+ | String r = String.valueOf(a) + String.valueOf(b); | ||
+ | return Integer.parseInt(r); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | class Cliente { | ||
+ | |||
+ | void f(A a) { | ||
+ | ... | ||
+ | a.suma(1, | ||
+ | ... | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | class Main { | ||
+ | |||
+ | void main() { | ||
+ | A a = new A(); | ||
+ | B b = new B(); | ||
+ | Cliente cliente = new Cliente(); | ||
+ | cliente.f(a); | ||
+ | cliente.f(b); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | En este ejemplo, el método que suma dos enteros ha sido redefinido en la subclase con una semántica de concatenación de los respectivos valores convertidos a cadenas. Por lo tanto, para un desarrollador encargado de mantener la clase Cliente, la situación se vuelve bastante confusa. En una ejecución, la llamada '' | ||
+ | |||
+ | |||
+ | |||