面向对象程序设计原则: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)。
假设代码中已经存在如下一个长方形类,写该类前未预料到将来需要一个正方形类。
- /* 长方形 */
- class Rectangle {
- public:
- void SetWidth(double w) { itsWidth = w; }
- void SetHeight(double h) { itsHeight = h; }
- double GetHeight() const { return itsHeight; }
- double GetWidth() const { return itsWidth; }
- private:
- Point itsTopLeft;
- double itsWidth;
- double itsHeight;
- };
未完待续。。。
阅读(1204) | 评论(0) | 转发(0) |