打字猴:1.70045358e+09
1700453580 编写高质量代码:改善Java程序的151个建议 建议148:增强类的可替换性
1700453581
1700453582 Java的三大特征:封装、继承、多态,这是每个初学者都会学习到的知识点,这里暂且不说封装和继承,单单说说多态。一个接口可以有多个实现方式,一个父类可以有多个子类,并且可以把不同的实现或子类赋给不同的接口或父类。多态的好处非常多,其中有一点就是增强了类的可替换性,但是单单一个多态特性,很难保证我们的类是完全可以替换的,幸好还有一个里氏替换原则来约束。
1700453583
1700453584 里氏替换原则是说“所有引用基类的地方必须能透明地使用其子类的对象”,通俗点讲,只要父类型能出现的地方子类型就可以出现,而且将父类型替换为子类型还不会产生任何错误或异常,使用者可能根本就不需要知道是父类型还是子类型。但是,反过来就不行了,有子类型出现的地方,父类型未必就能适应。
1700453585
1700453586 为了增强类的可替换性,就要求我们在设计类的时候考虑以下三点:
1700453587
1700453588 (1)子类型必须完全实现父类型的方法
1700453589
1700453590 子类型必须完全实现父类型的方法,难道还有能不实现父类型的方法?当然有,方法只是对象的行为,子类完全可以覆写,正常情况下覆写只会增强行为的能力,并不会“曲解”父类型的行为,一旦子类型的目的不是为了增强父类型行为,那替换的可能性就非常低了,比如这样的代码:
1700453591
1700453592 //枪
1700453593
1700453594 interface Gun{
1700453595
1700453596 //枪用来干什么的?射击杀戮!
1700453597
1700453598 public void shoot();
1700453599
1700453600 }
1700453601
1700453602 //手枪
1700453603
1700453604 class Handgun implements Gun{
1700453605
1700453606 @Override
1700453607
1700453608 public void shoot(){
1700453609
1700453610 System.out.println(“手枪射击……”);
1700453611
1700453612 }
1700453613
1700453614 }
1700453615
1700453616 //玩具枪
1700453617
1700453618 class ToyGun implements Gun{
1700453619
1700453620 @Override
1700453621
1700453622 public void shoot(){
1700453623
1700453624 //玩具枪不能射击,这个方法就不实现了
1700453625
1700453626 }
1700453627
1700453628 }
1700453629
[ 上一页 ]  [ :1.70045358e+09 ]  [ 下一页 ]