里氏替换原则

suaxi
2022-08-22 / 0 评论 / 22 阅读 / 正在检测是否收录...

定义:子类可以扩展父类的功能,但不能改变父类原有的功能(子类继承父类时,除了添加新的方法和功能外,尽量不要重写父类的方法)

以正方形不是长方形为例:

在resize方法中,Rectangle类型的参数不能被Square类型的参数所代替,如果进行了替换,则不能得到预期的打印结果
2.1里氏替换原则UML.png

Rectangle

public class Rectangle {

    private double length;
    private double width;

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }
}

Square

public class Square extends Rectangle {
    @Override
    public void setLength(double length) {
        super.setLength(length);
        super.setWidth(length);
    }

    @Override
    public void setWidth(double width) {
        super.setWidth(width);
        super.setLength(width);
    }
}

RectangleDemo

public class RectangleDemo {

    public static void main(String[] args) {
        //创建长方形对象
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20);
        rectangle.setWidth(10);
        //扩宽
        resize(rectangle);
        printLengthAndWidth(rectangle);


        System.out.println("====================");

        //创建正方形
        Square square = new Square();
        square.setWidth(20);
        resize(square);
        //在resize方法中,Rectangle类型的参数不能被Square类型的参数所代替,如果进行了替换,则不能得到预期的打印结果
        printLengthAndWidth(square);
    }

    public static void resize(Rectangle rectangle) {
        //如果长 > 宽,进行扩宽操作
        while (rectangle.getLength() >= rectangle.getWidth()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    public static void printLengthAndWidth(Rectangle rectangle) {
        System.out.println("长:" + rectangle.getLength());
        System.out.println("宽:" + rectangle.getWidth());
    }
}



改进:

抽象出四边形接口,长方形、正方形实现四边形接口
2.2里氏替换原则UML.png

Quadrilateral

public interface Quadrilateral {

    /**
     * 获取长
     *
     * @return
     */
    double getLength();

    /**
     * 获取宽
     *
     * @return
     */
    double getWidth();
}

Rectangle

public class Rectangle implements Quadrilateral {

    private double length;
    private double width;

    public void setLength(double length) {
        this.length = length;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    @Override
    public double getLength() {
        return length;
    }

    @Override
    public double getWidth() {
        return width;
    }
}

Square

public class Square implements Quadrilateral {

    private double side;

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }

    @Override
    public double getLength() {
        return side;
    }

    @Override
    public double getWidth() {
        return side;
    }
}

RectangleDemo

public class RectangleDemo {

    public static void main(String[] args) {
        //创建长方形对象
        Rectangle rectangle = new Rectangle();
        rectangle.setLength(20);
        rectangle.setWidth(10);
        resize(rectangle);
        printLengthAndWidth(rectangle);

        System.out.println("====================");

        //创建正方形对象(此时正方形和长方形不存在父子关系)
        Square square = new Square();
        square.setSide(10);
        printLengthAndWidth(square);
    }

    public static void resize(Rectangle rectangle) {
        //如果长 > 宽,进行扩宽操作
        while (rectangle.getLength() >= rectangle.getWidth()) {
            rectangle.setWidth(rectangle.getWidth() + 1);
        }
    }

    public static void printLengthAndWidth(Quadrilateral quadrilateral) {
        System.out.println("长:" + quadrilateral.getLength());
        System.out.println("宽:" + quadrilateral.getWidth());
    }
}
0

评论 (0)

取消