锁定老帖子 主题:OO—现实与实现的分歧
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-04
这里要根据行为建模,而不是照搬数学概念
矩形和正四边形具有不同的行为,不应该谁继承谁 |
|
返回顶楼 | |
发表时间:2007-03-04
不是什么OO问题,是对长方形的认识问题,看来阎博士是对长方形的概念理解错了。
|
|
返回顶楼 | |
发表时间:2007-03-04
正常情况下正方形是矩形的特例,所以正方形是矩形的子类,因为是特例所以多了很多约束,所以很多方法是需要覆盖父类的。
|
|
返回顶楼 | |
发表时间:2007-03-04
magic_seek 写道 正常情况下正方形是矩形的特例,所以正方形是矩形的子类,因为是特例所以多了很多约束,所以很多方法是需要覆盖父类的。
11楼是正解啊。 这里不是什么覆盖父类的问题,考虑这样的代码 public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); } 分别传入长方形和正方形的实例,分别是什么结果? |
|
返回顶楼 | |
发表时间:2007-03-04
public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); } 正方形应该在setter里面保证长宽相等 或者在不相等的时候throw Exception setLength的时候长宽都为5 setWidth的时候长宽都为4 然后assertEquals的时候应该是失败,20VS16 |
|
返回顶楼 | |
发表时间:2007-03-04
Julien 写道 public void t(Rectangle r){ r.setLength(5); r.setWidth(4); assertEquals(20, r.getArea()); } 正方形应该在setter里面保证长宽相等 或者在不相等的时候throw Exception setLength的时候长宽都为5 setWidth的时候长宽都为4 然后assertEquals的时候应该是失败,20VS16 那么使用这些类的程序应该怎么写?是不是先判断一下类型? 说来说去,又回到正方形不能继承长方形了。 |
|
返回顶楼 | |
发表时间:2007-03-04
1、正方形是可以继承长方形的(但这是有前提的,仅继承直角平行四边形)
事实上正方形还可以继承菱形(仅继承边长相等这个概念) 2、长方形的长和宽这两个属性及其相关方法不应该被正方形继承 |
|
返回顶楼 | |
发表时间:2007-03-05
关键要看调用者的上下文,看其对行为方式的预期
在上下文中正方形和长方形的行为方式相同的才能继承,不同的话就不能 Bob大叔在《敏捷软件开发》的LSP一章中提到过这个问题 |
|
返回顶楼 | |
发表时间:2007-03-05
我觉得是对现实的模型理解有误,现实中并没有长方形/正方形这种物体,长方形/正方形只是物体的一个外观,当物体改变长度/宽度以后,其形状会发生变化,因此不存在正方形改变长度/宽度会变成非正方形,只存在物体改变了长度/宽度,从而使得形状从正方形变成了非正方形。
当然纯粹从几何学的角度可以另外讨论。 |
|
返回顶楼 | |
发表时间:2007-03-05
二年前就有人在这个论坛讨论过的问题
观点一 长方型不是正方型的父类 两个的基本属性不同 一个是长宽,另一个是边长 观点二 长方型可以长宽不等 那么正方型就是长宽相等 所以型状的改变就不是单独改变长宽 而是两个一起改变 如果方型,改变成不同时抛出异常 观点三 方型重写 改变长宽的方法 让每次改变是将长宽同时改变 观点不同建模也不同 |
|
返回顶楼 | |