1700454495
设计模式之禅 2.2 纠纷不断,规则压制
1700454496
1700454497
里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义。
1700454498
1700454499
1.子类必须完全实现父类的方法
1700454500
1700454501
我们在做系统设计时,经常会定义一个接口或抽象类,然后编码实现,调用类则直接传入接口或抽象类,其实这里已经使用了里氏替换原则。我们举个例子来说明这个原则,大家都打过CS吧,非常经典的FPS类游戏,我们来描述一下里面用到的枪,类图如图2-1所示。
1700454502
1700454503
1700454504
1700454505
1700454506
图2-1 CS游戏中的枪支类图
1700454507
1700454508
枪的主要职责是射击,如何射击在各个具体的子类中定义,手枪是单发射程比较近,步枪威力大射程远,机枪用于扫射。在士兵类中定义了一个方法killEnemy,使用枪来杀敌人,具体使用什么枪来杀敌人,调用的时候才知道,AbstractGun类的源程序如代码清单2-1所示。
1700454509
1700454510
代码清单2-1 枪支的抽象类
1700454511
1700454512
public abstract class AbstractGun{
1700454513
1700454514
//枪用来干什么的?杀敌!
1700454515
1700454516
public abstract void shoot();
1700454517
1700454518
}
1700454519
1700454520
手枪、步枪、机枪的实现类如代码清单2-2所示。
1700454521
1700454522
代码清单2-2 手枪、步枪、机枪的实现类
1700454523
1700454524
public class Handgun extends AbstractGun{
1700454525
1700454526
//手枪的特点是携带方便,射程短
1700454527
1700454528
@Override
1700454529
1700454530
public void shoot(){
1700454531
1700454532
System.out.println(“手枪射击……”);
1700454533
1700454534
}
1700454535
1700454536
}
1700454537
1700454538
public class Rifle extends AbstractGun{
1700454539
1700454540
//步枪的特点是射程远,威力大
1700454541
1700454542
public void shoot(){
1700454543
[
上一页 ]
[ :1.700454494e+09 ]
[
下一页 ]