设计模式六大原则之Liskov替换原则

Liskov替换原则


任何基类出现的地方都应该可以无差别的使用子类替换。

why


继承的优点是大大提升了代码的复用度,但是缺点也同样明显:增加了对象的耦合程度,破坏了程序的封装性,导致程序的可移植性变差。
使用Liskov替换原则可以大大减少我们代码的出错概率。

how


遵守Liskov替换规则的方法:子类可以扩展新功能,但是尽量不要重写/重载父类的接口。

例子


正方形与矩形抽象。
一般情况下,我们会把正方形当作一种特殊的矩形。按照这种思路,我们可以得出如下代码。

//矩形
class Rectangle
{
    private:
        double height;
        double width;
    public:
        double getWidth(){return width;}
        double getHeight(){return height;}
        void setWidth(double var){width = var;}
        void setHeight(double var){height = var;}
};
//正方形
class Square:public Rectangle
{
    double getWidth(){return width;}
    void setWidth(double var){width = height = var;}
};

在这种思路下,我们在父类Rectangle调用setWidth()的地方替换子类Square时会,会导致正方形的长与宽都会被改变。这跟Liskov原则是相违背的。
这时候我们重新改写一下上面的代码。

//四边形
abstract Quadrangle
{
    public:
        double getWidth();
        void setWidth(double var);
};

//矩形
class Rectangle:public Quadrangle
{
    private:
        double height;
        double width;
    public:
        double getWidth(){return width;}
        double getHeight(){return height;}
        void setWidth(double var){width = var;}
        void setHeight(double var){height = var;}
};
//正方形
class Square:public Quadrangle
{
    private:
        double width;
    public:
        double getWidth(){return width;}
        void setWidth(double var){width = var;}
};

改写之后符合Liskov principle了。

你可能感兴趣的:(design,pattern)