从设计模式上来说,平衡二叉排序树应不应该作为二叉排序树的子类?

ccnyou 2012-11-14 09:34:10
之前有记得一个经典例子:正方形不应该作为矩形的子类,因为正方形定义中比矩形多了一个限制:长==宽
对于平衡二叉排序树来说,也多了个限制:左右子树之间的深度差的绝对值不超过 1 。
但是。。。这貌似又影响不大。。。然后我就纠结了。求指教。
...全文
206 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccnyou 2012-11-20
  • 打赏
  • 举报
回复
生不能做成人的子类?为什么呢?
sxcong 2012-11-19
  • 打赏
  • 举报
回复
书中还提了相关不少例子,比如企鹅与鸟,学生与人。如果企鹅不能做成鸟的子类,学生不能做成人的子类,那不是c++太失败,就是没用好c++。 从抽象上来讲,父类是抽象子类公共部分。但作者的意思是,绝大多数鸟都是会飞的,只有40多种鸟不会(据里约大冒险里那只鹦鹉所说,应该是真的)。所以,正常的抽象,父类不应该有fly。如果父类里没有fly,每种鸟都要加一个。而父类有的话,绝大多数都不需要了,这样对实际情况很有帮助。对这些不会飞的鸟,不要public继承就行了。 你要仔细体会作者要说的意思,而不是盲目地拿他这个例子来教条地学c++
sxcong 2012-11-19
  • 打赏
  • 举报
回复
父类是子类的抽象,如果对父类操作引起子类异常,那说明父类没设计好。 你说的这个问题在effective c++里也提到了,而且书里也提到了解决的方法。既然SetWidth合适,那就不要 public继承,子类重新实现一个好了。比如矩形的SetWidth是 m_nWidth = width; 正方形需要:m_nHeight = m_nWidth = width; 很显然的一个道理,比如考试时给你一个题,说正方形宽度增加1倍,面积增加多少,你怎么回答。c++是解决实际工作的,不是教条主义。
ccnyou 2012-11-14
  • 打赏
  • 举报
回复
1楼的说法~不同意。这是有问题的,从属性上来说正方形是矩形,但是从操作来说,不可行。明显,矩形如果有个SetWidth方法,如果被正方形继承了,就乱套了,行为根本无法预测,甚至容易引发隐晦的异常 书叫做《模式的乐趣》
sxcong 2012-11-14
  • 打赏
  • 举报
回复
哪本书说正方形不是矩形的?
sxcong 2012-11-14
  • 打赏
  • 举报
回复
“因为正方形定义中比矩形多了一个限制” 就是因为这样,它才是子类啊,正方形是矩形的一种。

3,405

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 设计模式
社区管理员
  • 设计模式
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧