打字猴:1.70045362e+09
1700453620 @Override
1700453621
1700453622 public void shoot(){
1700453623
1700453624 //玩具枪不能射击,这个方法就不实现了
1700453625
1700453626 }
1700453627
1700453628 }
1700453629
1700453630 上面定义了两种类型的枪支:手枪和玩具枪,手枪可以用来射击敌人(shoot方法),但玩具枪就完全不同了,它不能用来射击,只是一个虚假的玩具而已,如果我们在要求使用枪支的地方传递了玩具枪会出现什么问题呢?代码如下:
1700453631
1700453632 public static void main(String[]args){
1700453633
1700453634 Gun gun=new Handgun();
1700453635
1700453636 gun.shoot();
1700453637
1700453638 }
1700453639
1700453640 此处是一个手枪,用来射击,如果使用了子类型ToyGun,士兵将会拿着玩具枪来杀人,可是射不出子弹呀!如果在CS游戏中有这种事情发生,那就等着被人爆头,然后看着自己凄凉的倒地。
1700453641
1700453642 此处不能替换的原因是子类型没有完全实现父类型的方法,而是丢弃了父类型的行为能力,导致子类型不具备父类型的部分功能了。
1700453643
1700453644 (2)前置条件可以被放大
1700453645
1700453646 方法中的输入参数称为前置条件,它表达的含义是你要让我执行,就必须满足我的条件。前置条件是允许放大的,这样可以保证父类型行为逻辑的继承性,比如有这样的代码:
1700453647
1700453648 class Base{
1700453649
1700453650 public void doStuff(HashMap map){
1700453651
1700453652 }
1700453653
1700453654 }
1700453655
1700453656 class Sub extends Base{
1700453657
1700453658 public void doStuff(Map map){
1700453659
1700453660 }
1700453661
1700453662 }
1700453663
1700453664 这是Java的重载实现,子类型在实现父类型的同时也具备了自己的个性,可以处理比父类型更宽泛的任务,而且不会影响父类的任何行为,例如在如下代码中把父类型替换为子类型就不会有任何变化:
1700453665
1700453666 public static void main(String[]args){
1700453667
1700453668 Base b=new Base();
1700453669
[ 上一页 ]  [ :1.70045362e+09 ]  [ 下一页 ]