prinsipio de substitucion de liskov

Upload: jgc

Post on 13-Feb-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 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.