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