里氏代换原则定义: 一个软件实体使用的是一个基类的话,那么一定适用于其子类,这个软件实体察觉不出基类和子类对象的区别。
第一个辩证题目:正方形是否是长方形的子类? 答案:不是。
既然正方形也属于长方形的一种特殊形式,满足IS关系,为什么不能是其子类呢?
答:如果我们作成派生关系,为了满足正方形的长、宽相等,当调用正方形的setWidth(),或者setLength()时,必须将同时修改width和length。
但作为软件实体他并不知道这些,如果它有下面类似的函数,参数实例如果是长方形没有问题,但如果换成了子类(正方形)后,这个函数将会陷入死循环。死循环的原因是因为在修改宽度的时候同时修改了长度。。
void AdujstWidth(Rectangle r)
{
while(r.getWidth() <= r.getLength())
{
r.setWidth(r.getWidth() + 1);
}
}
这样就就违背了里氏代换原则的原则。所以不应该将正方形定义为长方形的子类。
第二个辩证题目:经理、雇员、学生、老师是不是人的子类? 答案:不是
虽然说经理是人,雇员、学生和老师也是人。
但如果建立这种派生关系后,子类实例化后,人的身份就确认了(特定形态)。
要不是经理,要么是雇员,要么是学生、要么是老师。
但这明显不合符逻辑,因为一个人是经理的同时也可能同时是雇员、学生或老师。
所以这些类应该派生于职业,而不是派生于人。
同样,软件实体操作的对象应该是职业,而不是人。