Java学习(继承)——继承的设计技巧

目录

1.将公共操作和字段放在超类中

2.不要使用受保护字段

3.使用继承实现“is-a”关系

4.除非所有的继承的方法都有意义,否则不要使用继承

5.在覆盖方法时不要改变预期的行为

6.使用多态,而不要使用类型信息


1.将公共操作和字段放在超类中

  • 就是将名字字段放在Person字段中,而没有把他重复的放在Employee和Student类中

2.不要使用受保护字段

  • protected机制并不能带来更多的保护

    • 子类集合时无限制的,任何一个人都能够派生出这个类的子类,从而访问protected实例字段,从而破坏了封装性

    • 在Java中,在同一个包的所有类都能访问受保护字段,而不需要知道是否是这个类的子类。

3.使用继承实现“is-a”关系

  • 使用继承很容易达到节省代码的目的,但是有时候会被人很滥用

  • 假设需要一个钟点工类,很容易被人们认为这个类是员工的子类,但是钟点工只有姓名和雇佣日期,而没有工资,但是有时薪

  • 但这并不是一个好的主意,因为这样以来钟点工就有了时薪和工资两个字段,这在打印钟点工的信息时会产生很多麻烦

  • 可见,钟点工和员工之间并不是“is-a”关系,钟点工不是特殊的员工。

4.除非所有的继承的方法都有意义,否则不要使用继承

  • 假设想要编写一个Holiday类,毫无疑问,每个假日都是一天并且每一天都能用GregorianCalender类的一个实例,无疑,Holiday类继承了GregorianCalender类

    class Holiday extends GregoianCalender{...}
  • 但是在GregorianCalender类中,有一个方法add,这个方法用于将非假日,变为假日,但这对Holiday类时没有用,没有意义的,所以在继承的操作中,假日集合不是封闭的

  • 显然,继承对这个例子不太合适

5.在覆盖方法时不要改变预期的行为

  • 替换原则不仅应用于语法,更重要的是,它也适用于行为,在覆盖一个方法的时候=不应该毫无理由的改变方法的行为

6.使用多态,而不要使用类型信息

  • 如果出现了下面的代码

    if(x is of type 1){
        action1(x);
    }
    if(x is of type 2){
        action2(x);
    }
  • 都应该考虑使用多态。

  • 当action1和action2表示的是相同的概念吗?如果是相同的概念,就应该为这个概念定义一个方法,并将其放在两个类型的超类中

  • 使用多态性固有的动态分配机制执行正确的动作

  • 使用多态方法或者接口实现的代码,比使用多个类型检测的代码更容易维护和扩展

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iron_Sp-man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值