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

原创 2016年01月30日 16:27:55

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了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式六大原则(2):里氏替换原则

肯定有不少人跟我刚看到这项原则的时候一样,对这个原则的名字充满疑惑。其实原因就是这项原则最早是在1988年,由麻省理工学院的一位姓里的女士(Barbara Liskov)提出来的。 定义1:如果对每...
  • zhengzhb
  • zhengzhb
  • 2012年02月22日 08:46
  • 87940

面向对象设计原则之里氏代换原则

里氏代换原则由2008年图灵奖得主、美国第一位计算机科学女博士Barbara Liskov教授和卡内基·梅隆大学Jeannette Wing教授于1994年提出。其严格表述如下:如果对每一个类型为S...
  • LoveLion
  • LoveLion
  • 2012年05月06日 21:56
  • 29154

面向对象六大原则(三):里氏替换原则

面向对象程序设计(OOP)的六大原则是我对《Android源码设计模式解析与实战》的读后笔记。要设计出灵活又便于维护的软件,必须要求我们的设计能力与代码质量高,也就是我们所谓的编程思想。因此,我们需以...

六大设计原则之里氏替换原则

里氏替换原则定义里氏替换原则(Liskov Substitution Principle,LSP): 第一种定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所...

里氏替换原则的理解

一直都搞不明白里氏替换原则的后面两条,到今天才知道原来是自己没有认真思考。闲话不说,记录下来吧以后方便查看。 里氏替换原则的主要作用就是规范继承时子类的一些书写规则。其主要目的就是保持父类方法不被覆盖...

设计模式六大原则——里氏替换原则(LSP)

概述        里氏替换原则(LSP,Liskov Substitution Principle)是关于继承机制的原则,是实现开放封闭原则的具体规范,违反了里氏替换原则必然违反了开放封闭原则。  ...

软件设计原则----LisKov替换原则(LSP)

“一个软件实体如果使用的是一个基类的话,一定适用于其子类,而且根本不能觉察出基类对象和子类对象的区别。” 陈述: 子类型(Subtype)必须能够替换他们的基类型(Basetype) B...

设计原则(二)里氏替换原则(LSP)

一、什么是里氏替换原则 里氏替换原则的严格表达是:如果对每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都替换成o2时,程序P的行为没有变化,那么类型...

【六大设计原则】2. 里氏替换原则 -Liskov Substitution Principle

LSP,Liskov Substitution Principle: 1) If for each object s of type S, there is an objectt of type T ...

6大设计原则(二)---里氏替换原则

里氏替换原则 英文名称(Liskov Substitution Principle,LSP):   定义:所有引用基类的地方必须能够透明地使用其子类的对象  我的理解: 父类出现的地方也可以用子类来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式六大原则之Liskov替换原则
举报原因:
原因补充:

(最多只允许输入30个字)