Chinaunix首页 | 论坛 | 博客
  • 博客访问: 851548
  • 博文数量: 389
  • 博客积分: 2874
  • 博客等级: 少校
  • 技术积分: 3577
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:34
文章分类

全部博文(389)

文章存档

2020年(2)

2018年(39)

2017年(27)

2016年(3)

2015年(55)

2014年(92)

2013年(54)

2012年(53)

2011年(64)

分类:

2011-09-23 09:05:41

原文地址:Liskov替换原则 作者:c_jwzheng

面向对象程序设计原则:Liskov替换原则(LSP)
 
Liskov替换原则是使开放封闭原则(OCP)成为可能的主要原则之一。
实现OCP原则的主要机制是抽象(Abstraction)和多态(polymorphism)。在像C++、Java这样的静态语言中,支持抽象和多态的关键技术之一是继承。但是如何才能创建最佳的继承层次关系而使其符合OCP原则呢?这正是LSP所要解答的问题。
 
什么是LSP呢?Barbara Liskov在188年写出了如下定义:
    若对每个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,
    用o1替换o2后,程序P的行为功能不变,则S是T的子类型
 
也就是:
    子类型(subtype)必须能够替换掉它们的基类型(base type)。
 
假设有一个函数f,它的参数为指向某个基类B的指针或者引用,同样假设有B的某个派生类D,如果把D的对象作为B类型传递给f,会导致f出现错误行为,那么D就违反了LSP。
 
经典的例子:正方形(square)继承自长方形(Rectangle)。
 
假设代码中已经存在如下一个长方形类,写该类前未预料到将来需要一个正方形类。
  1. /* 长方形 */
  2. class Rectangle {
  3. public:
  4.     void SetWidth(double w) { itsWidth = w; }
  5.     void SetHeight(double h) { itsHeight = h; }
  6.     double GetHeight() const { return itsHeight; }
  7.     double GetWidth() const { return itsWidth; }

  8. private:
  9.     Point itsTopLeft;
  10.     double itsWidth;
  11.     double itsHeight;
  12. };
 
未完待续。。。
阅读(697) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~