« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
暂无公告... |
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原则。 |
|
|