7/23/2019 Prinsipio de substitucion de Liskov
1/18
Principio de substitucinde Liskov
(LSP)
7/23/2019 Prinsipio de substitucion de Liskov
2/18
Donde quiera que se usaba la
superclase, se puede usar la
subclase
LiskovSubstitution
Principle
Sub
Super
7/23/2019 Prinsipio de substitucion de Liskov
3/18
Como fue enunciado en 1988
Methods that use references to thebase classes must be able to use the
objects of the derived classes without
knowing it
7/23/2019 Prinsipio de substitucion de Liskov
4/18
Extender una clase...
Significa especializarla, aadirle atributos,
hacer ms especfico su comportamiento,
aadir mtodos, sobreponer (overriding)
mtodos respetando la firma precisa,
sobrecargar (overloading) mtodosespecializando el servicio.
7/23/2019 Prinsipio de substitucion de Liskov
5/18
As que...
Para respetar el LSP:
La subclase no puede prohibir algo que se permita en
la superclase. Los mtodos de la subclase deben entregar el mismo
tipo (o uno derivado) como resultados.
Los mtodos de la subclase deben recibir el mismo tipo
(o uno derivado) de parmetros. Donde quiera que se usaba una referencia a un objeto
de la superclase, se debe poder usar una a un objeto
de la subclase y todo debe funcionar igual.
7/23/2019 Prinsipio de substitucion de Liskov
6/18
Ejemplo: Ave
class Ave { public void volar(){}
public void comer(){}
}
7/23/2019 Prinsipio de substitucion de Liskov
7/18
Ejemplo: subclases
class Cuervo extends Ave {}
class Guajolote extends Ave { volar(){
throw new
UnsupportedOperationException(); }
}
7/23/2019 Prinsipio de substitucion de Liskov
8/18
Ejemplo: prueba main
public AveTest {
public static void main(String[] args){
List aves = new ArrayList(); aves.add(new Ave());
aves.add(new Cuervo());
aves.add(new Guajolote()); hagamosQueVuelen(aves);
}
7/23/2019 Prinsipio de substitucion de Liskov
9/18
Ejemplo: prueba
hagamosQueVuelen
static void hagamosQueVuelen(List
lstaves){
for (Ave pajaro : lstaves) { pajaro.vuela();
}
}} // Fin de AveTest
7/23/2019 Prinsipio de substitucion de Liskov
10/18
Por qu no jala
Guajolote no vuela. Prohibe hacer algo que se
poda en la superclase.
7/23/2019 Prinsipio de substitucion de Liskov
11/18
Cmo se resuelve?
Factorizando:
Lo comn a todas las instancias de Ave es quecomen. As que Ave slo come.
De ella derivan dos subclases: las que vuelan y
las que no.
Cuervo es subclase de la las que vuelan.
Guajolote es subclase de las que no vuelan.
7/23/2019 Prinsipio de substitucion de Liskov
12/18
Es decir...
class Ave{
public void comer(){}
}
class AveVoladora extends Ave {
public void vuela()()
}
class AveNoVoladora extends Ave{}
7/23/2019 Prinsipio de substitucion de Liskov
13/18
Otro
class Rectangle {
protected int m_width;
protected int m_height;
public void setWidth(int width) {m_width = width;
}
public void setHeight(int height) {
m_height = height;}
public int getWidth() {
return m_width;
}
7/23/2019 Prinsipio de substitucion de Liskov
14/18
Otro
class Rectangle {
// lo anterior
public int getHeight() {
return m_height;}
public int getArea() {
return m_width * m_height;
}}
7/23/2019 Prinsipio de substitucion de Liskov
15/18
Cuadrado
class Square extends Rectangle {
public void setWidth(int width) {
m_width = width;
m_height = width;}
public void setHeight(int height) {
m_width = height;
m_height = height;}
}
7/23/2019 Prinsipio de substitucion de Liskov
16/18
Prueba
class LspTest {
private static Rectangle getNewRectangle() {
// it can be an object returned by some factory ...
return new Square();}
7/23/2019 Prinsipio de substitucion de Liskov
17/18
Prueba
public static void main (String args[]) {
Rectangle r = LspTest.getNewRectangle();
r.setWidth(5);
r.setHeight(10);// user knows that r it's a rectangle.
// It assumes that he's able to set
// the width and height as for the base class
System.out.println(r.getArea());// now he's surprised to see that the
// area is 100 instead of 50.
}
} // Fin de Prueba
7/23/2019 Prinsipio de substitucion de Liskov
18/18
Qu sali mal?
Todo cuadrado ES UN rectngulo, qu no? Es que la relacin ES UN es un poco menos
superficial. Lo de ES UN debe estar referido al
COMPORTAMIENTO, no slo a los atributos.
Un cuadrado es un caso particular de rectngulo, pero
NO puedo usarlo siempre que usaba un rectngulo. Si tengo que modificar el programa para adecuarlo
cuando uso una subclase particular, estoy violando el
principio Open/Close, que generaliza el LSP.
Top Related