《代码大全》读书笔记之 类的继承

派生后覆盖了某个子程序,但在其中没做任何操作,这种情况也值得怀疑 这通常表明基类的设计中有错误。举例来说,假设你有一个Cat(猫)类,它有一个Scratch()(抓)成员函数,可是最终你发现有些猫的爪尖儿没了,不能抓了。你可能想从Cat类派生一个叫ScratchlessCat(不能抓的猫)的类,然后覆盖Scratch()方法让它什么都不做。但这种做法有这么几个问题:

           它修改了Cat类的接口所表达的语义,因此破坏了Cat类所代表的抽象(即接口契约)。

           当你从它进一步派生出其他派生类时,采用这一做法会迅速失控。如果你又发现有只猫没有尾巴该怎么办?或者有只猫不捉老鼠呢?再或者有只猫不喝牛奶?最终你会派生出一堆类似ScratchlessTaillessMicelessMilklessCat(不能抓、没尾巴、不捉老鼠、不喝牛奶的猫)这样的派生类来。

           采用这种做法一段时间后,代码会逐渐变得混乱而难以维护,因为基类的接口和行为几乎无法让人理解其派生类的行为。

修正这一问题的位置不是在派生,而是在最初的Cat类中。应该创建一个Claw(爪子)类并让Cat类包含它。问题的根源在于做了所有猫都能抓的假设,因此应该从源头上解决问题,而不是到发现问题的地方修补。


如果不能确认一定用继承,就不要用。
如果确认一定要用继承,就应该搞清楚抽象的级别。搞清楚哪些该实现,哪些不该实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值