设计原则之里氏代换原则

设计原则之里氏代换原则

substitute  = replace 替换
sub 下 st石头 i我  tu土 te特别
我用石头替换下土,造了特比坚固的房子

hierarchy  [‘harɑk] = level 等级
hi海豹  er儿子  ar are是  ch成龙
海豹儿子的雷霆战机等级是比成龙高

derive [di‘raiv]  起源,派生
de德国  rive river河
德国的莱茵河起源于阿尔卑斯山

动机:
        当我们创建类的层级(继承),我们继承一些类,创建一些派生类。我们必须确保新的派生类只是继承而不是代替父类的方法。否则子类可能产生意想不到的影响当它们被使用的时候。

结论:        里氏替换原则是开闭原则的扩展,它意味着我们要确保子类继承父类的时候不要改变父类的行为。

Example:    当正方形类继承矩形类,setWidth()和setHeight()会产生误解

// Violation of Likov‘s Substitution Principle
class Rectangle
{
    protected int m_width;
    protected int m_height;
    public void setWidth(int width){
        m_width = width;
    }
    public void setHeight(int height){
        m_height = height;
    }
    public int getWidth(){
        return m_width;
    }
    public int getHeight(){
        return m_height;
    }
    public int getArea(){
        return m_width * m_height;
    }    
}
class Square extends Rectangle 
{
    public void setWidth(int width){
        m_width = width;
        m_height = width;
    }
    public void setHeight(int height){
        m_width = height;
        m_height = height;
    }
}
class LspTest
{
    private static Rectangle getNewRectangle()
    {
        // it can be an object returned by some factory ... 
        return new Square();
    }
    public static void main (String args[])
    {
        Rectangle r = LspTest.getNewRectangle();
        r.setWidth(5);
        r.setHeight(10);
        // user knows that r it‘s a rectangle. 
        // It assumes that he‘s able to set the width and height as for the base class
        System.out.println(r.getArea());
        // now he‘s surprised to see that the area is 100 instead of 50.
    }
}
时间: 2024-10-25 08:26:24

设计原则之里氏代换原则的相关文章

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

http://blog.csdn.net/lovelion/article/details/7540445 里氏代换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象. 在使用里氏代换原则时需要注意如下几个问题: (1)子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法.根据里氏代换原则,为了保证系统的扩展性,在程序中通常使用父类来进行定义,如果一个方法只存

设计模式中的里氏代换原则

设计模式中的里氏代换原则 Table of Contents 1 里氏代换原则 2 模式中的里氏代换原则 2.1 策略模代 2.2 合成模式 2.3 代理模式 3 如何继承 3.1 不要从具体类继承 3.2 避免错误继承 1 里氏代换原则 从开-闭原则中可以看出来面向对象的重要原则是创建抽象化,并从抽象化导出具体化.具 体化可以给出不同的版本,每一版本都给出不同的实现.里氏代换原则从另一个侧面描述 抽象化和具体化,里氏代换原则表明:一个软件如果使用的是一个基类的话,那么一定适 用于其子类,而且它

设计模式之里氏代换原则(LSP)

里氏代换原则(Liskov Substitution Principle, LSP) 1 什么是里氏代换原则 里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章<Data Abstraction and Hierarchy>里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理.2002年,我们前面单一职责原则中提到的软件工程大师Robert C. Martin,

设计模式 之 里氏代换原则 (Liskov&#39;s Substitution Principle)

Motivation 动机 All the time we design a program module and we create some class hierarchies. Then we extend some classes creating some derived classes. 一直以来,我们设计程序模块,并且建立类的层次关系,然后扩展类来创建派生类. We must make sure that the new derived classes just extend wi

里氏代换原则等

<Java与模式>读书笔记. 里氏代换原则 里氏代换原则(LSP)简言之就是基类的属性方法一定是适应于子类的,反之则不然. 在编译期,Java编译器就会检查程序是否是符合里氏代换原则,不符合就不能通过.违反里氏代换原则的一个例子就是子类试图将基类中的public方法覆盖为private方法,是编译不过的,子类中接口的使用范围只能更广. Java编译器检查程序是否是符合里氏代换原则是有限的,实现层次和逻辑层次是无法判断的. Java API中也有违反里氏代换原则的例子,Properties继承自

里氏代换原则

若对于每一个类型S的对象o1,都存在一个类型T的对象o2,使得在所有针对T编写的程序P中,用o1替换o2后,程序P的行为功能不变,则S是T的子类型. What is wanted here is something like the following substitution property: If for each object o1 of type S there is an object o2 of type T such that for all programs P defined

模式-“里氏代换原则”

里氏代换原则是指拥有相同基类的两个子类,在使用子类A的地方(方法/属性)可以用子类 B来代替.对于面向接口编程,我只需要保证代码的行为不变;基类所有的方法子类必须全部 实现,换过来,子类的方法基类不一定都有; 假设:有一个基类Base;其子类是Concrete;那么method(Base b)的调用可以转换成 method(Concrete c); 策略模式:一般,我们把解决某个问题的方法称为一个"算法",而把解决一类问题的算法封装 成一个接口,那么实现算法的多种方式作为子类;在某个时

西游记之设计模式原则——里氏代换原则

里氏代换原则 --子类能替换父类 1 package lishidaihuan; 2 3 class TangSeng { 4 public void QuJing() { 5 System.out.println("施主,贫僧自东土大唐而来,去往西天拜佛求经!"); 6 } 7 } 8 9 class TuDi extends TangSeng { 10 public void QuJing() { 11 super.QuJing(); 12 System.out.println(&

前端用到的设计模式之开闭原则. 里氏代换原则

开闭原则,如果jQuery源码稍微了解,肯定知道它的应用了. 一个模块----函数或对象,应该凭着经验来判断, 对扩展开放,对修改关闭.------ 一般用继承实现扩展,用闭包来实现关闭. 为什么开闭原则?它跟复杂度有什么关系,? 复杂度,就是一个函数里包含的功能个数;当开闭原则不遵守时,想扩展功能,必然去原来的函数里添加代码,导致原来的函数功能增加. 里氏代换原则:是对开闭原则的补充,子类可以扩展父类,但不可改变父类. function changFangxing(height,width){