打字猴:1.7004546e+09
1700454600 //给三毛一支枪
1700454601
1700454602 sanMao.setGun(new Rifle());
1700454603
1700454604 sanMao.killEnemy();
1700454605
1700454606 }
1700454607
1700454608 }
1700454609
1700454610 有人,有枪,也有场景,运行结果如下所示。
1700454611
1700454612 士兵开始杀敌人……
1700454613
1700454614 步枪射击……
1700454615
1700454616 在这个程序中,我们给三毛这个士兵一把步枪,然后就开始杀敌了。如果三毛要使用机枪,当然也可以,直接把sanMao.killEnemy(new Rifle())修改为sanMao.killEnemy(new MachineGun())即可,在编写程序时Solider士兵类根本就不用知道是哪个型号的枪(子类)被传入。
1700454617
1700454618 注意 在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
1700454619
1700454620 我们再来想一想,如果我们有一个玩具手枪,该如何定义呢?我们先在类图2-1上增加一个类ToyGun,然后继承于AbstractGun类,修改后的类图如图2-2所示。
1700454621
1700454622
1700454623
1700454624
1700454625 图2-2 枪支类图
1700454626
1700454627 首先我们想,玩具枪是不能用来射击的,杀不死人的,这个不应该写在shoot方法中。新增加的ToyGun的源代码如代码清单2-5所示。
1700454628
1700454629 代码清单2-5 玩具枪源代码
1700454630
1700454631 public class ToyGun extends AbstractGun{
1700454632
1700454633 //玩具枪是不能射击的,但是编译器又要求实现这个方法,怎么办?虚构一个呗!
1700454634
1700454635 @Override
1700454636
1700454637 public void shoot(){
1700454638
1700454639 //玩具枪不能射击,这个方法就不实现了
1700454640
1700454641 }
1700454642
1700454643 }
1700454644
1700454645 由于引入了新的子类,场景类中也使用了该类,Client稍作修改,源代码如代码清单2-6所示。
1700454646
1700454647 代码清单2-6 场景类
1700454648
1700454649 public class Client{
[ 上一页 ]  [ :1.7004546e+09 ]  [ 下一页 ]