使用继承——IS 原则

继承在java里体现在2个关键字,extends和implements。类和类之间继承使用extends,而类到接口使用的implements。

单从英文字面上理解,extends就是“扩展”的意思,也就是增强原来类的功能。是不是只要增强就使用继承?显然有问题。不要因为“增强”类的功能,而改变类原来的面貌,甚至把这个类改造成一个“全新”的类,这样会导致从现实角度理解两个毫不相关的类有很强的耦合关系。另外一个使用extends诱惑就是代码复用,父类有的子类都可以使用,好像只要使用一个关键字extends就可以省去n多代码,导致的结果和“增强”类似。

如有一个马类,和一个狗类
[code]
马{
跑(){}
骑(){}
}
狗 extends 马{
看家(){} //增加看家方法,复用跑的功能
}
[/code]
马能跑和骑。现在要定义一个狗类,狗不但能跑还能看家,于是就出现狗继承马,再加一个能看家的本领。我们怎么理解这条狗?!客户程序拿到马后就要“骑”,但确发出旺旺的狗叫声。你可能对着你的兄弟大声宣布,狗就是狗不能骑,只能跑。狗是狗,马是马,为什么不在代码上彻底理清关系。

有父子关系的类,父类和子类一定能像动植物学里一样,能划分到同一个科种。父类一定比子类更抽象,父类描述的是一般普遍具有的,子类描述相对父类而言是更进一步的具体行为和特征。这就是使用继承最原始的动力。

这里引出另外一个概念就是“具体依赖于抽象”。在java里使用extends的继承,父类和子类都是具体类。虽然能从代码上分辨出谁的抽象程度高,很多人不推荐使用extends,具体类永远没有接口(纯抽象)来的抽象,还是有一定道理。“具体依赖于抽象”还有把潜在错误丢给具体的意思,越抽象的或越概括的东西越不容易错。

使用implements的原则和使用extends一样,但implements一定暗示着多态。若一个接口只有一个实现类,那么这个接口就没有存在的必要(若后期又要增加实现类,只要重构提取出这个接口即可)。

使用继承用一句直白的话描述就是“[b]子类IS父类[/b]”,这就是唯一的[b]IS原则[/b]。可能很多人从书中不止一次看到过,很容易滑过。如:
[code]
马{}
黑马 extends 马{} //黑马是马
白马 extends 马{} //白马也是马
[/code]
[code]
兽{}
马 extends/implements 兽{} //马是兽
狗 extends/implements 兽{} //狗也是兽
[/code]

若一个类要使用另一个类里的功能,怎么办?!用委派合成等手段来实现,不要轻易使用继承实现这种复用或增强,使用前一定要用[b]IS原则[/b]衡量一下。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值