本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告
暂无公告...

我的分类(专题)

日志更新

最新评论

留言板

链接


Blog信息
blog名称:
日志总数:8
评论数量:19
留言数量:0
访问次数:70022
建立时间:2006年8月1日




[Java]LSP:里氏代换原则
读书笔记

爱睡觉的猫 发表于 2006/8/8 10:37:33

LSP严格的表达是:如果对每个类型为T1的对象O1,都有类型为T2的对象O2,使得T1定义的所有程序P在所有的对象O1替换成O2的时候,程序的行为没有发生变化,那么类型T2是类型T1的子类型。 也就是说,一个软件实体如果使用的是一个基类的话,那么就一定适用其子类,而且他根本不能察觉出子类跟基类的区别。但是反过来不成里:如果有b是基类对象,而d是子类对象的话,对于方法method(d),method(b)就不一定成立了。 对于运用LSP具体是实例有: 正方形不是长方形的子类。根据我们的生活常识,可能以为正方形是长方形的子类。但是如果长方形有这样一个方法,reSize() Public void resize(Rectangle r) { Whiel(r.getHeigth >=  r.getWidth) {   r.setWidth(r.getWidth+1); } } 对于正方形就不适用了,因为Height一改变,Width也就会改变,知道溢出为止。 而不变正方形是长方形的子类,因为不变正方形没有setSize 的方法。看到这里有点疑问,基类有的方法子类并一定有,这样不违反LSP吗? 对于违反LSP的结构要进行代码重构,如果A继承自B,但是违反了LSP,一般的做法是构造一个抽象类或接口,使之拥有A和B的公共方法,然后让A和B分别继承之。在正方形不是长方形的子类的问题中,我们可以通过定义一个四边形接口,该接口拥有方法getWidth和getHeight,但不拥有赋值的方法,这样就避免了reSize()的方法对于正方形的影响。然后让正方形和长方形继承这个接口。 JAVA在编译的时候会使用LSP去检查一个程序是否符合LSP原则。


阅读全文(3955) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144787357 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号