1、题目
使用多态实现士兵作战程序:编写一个Soldier类,描述具有普遍行为和属性的一个士兵对象。编写陆军士兵、海军士兵、军官类来扩展Soldier类。提示如下:
- 编写一个Soldier类。设计Soldier类的相关通用属性和方法,包括名字属性,攻击准备,攻击和攻击完成三个方法。其中攻击方法由子类具体实现,再增加一个模板方法action调用攻击准备,攻击和攻击完成三个方法;
- 编写陆军士兵 ArmySoldier、海军士兵 NavySoldier、军官类 Officer 来继承 Soldier 类,增加各自的特有属性和方法,并重写父类的攻击方法;
- 军官类增加新的方法allAction实现可以指挥团队(所有士兵和自己)一起行动,增加新的方法singleAction实现指挥某一个士兵单独行动;
- 编写一个SoldierTest类,创建军官,陆军士兵和海军士兵对象,调用军官类的方法指挥单个士兵和团队作战。
执行结果如下:
*** 单个陆军士兵作战 ***
攻击准备...
陆军士兵 魏大勇 使用步枪射击
攻击完成...
攻击准备...
陆军士兵 张大彪 使用步枪射击
攻击完成...
*** 单个海军士兵作战 ***
攻击准备...
海军士兵 田海洋 使用鱼雷攻击
攻击完成...
*** 所有士兵和军官一起作战 ***
攻击准备...
陆军士兵 魏大勇 使用步枪射击
攻击完成...
攻击准备...
陆军士兵 张大彪 使用步枪射击
攻击完成...
攻击准备...
海军士兵 田海洋 使用鱼雷攻击
攻击完成...
攻击准备...
军官 李云龙 使用手枪射击
攻击完成...
2、代码
1)士兵类
// 士兵类
public class Soldier {
private String name;
public Soldier(String name) {
= name;
}
public String getName() {
return name;
}
// 攻击准备方法
public void attack_ready() {
System.out.println("攻击准备...");
}
// 攻击方法
public void attack() {
System.out.println("攻击...");
}
// 攻击完成
public void attack_finish() {
System.out.println("攻击完成...");
}
// 模板方法
public void action() {
this.attack_ready();
this.attack();
this.attack_finish();
}
}
2)陆军士兵类
// 陆军士兵类
public class ArmySoldier extends Soldier {
public ArmySoldier(String name) {
super(name);
}
@Override
public void attack() {
System.out.printf("陆军士兵 %s 使用步枪射击", getName());
System.out.println();
}
}
3)海军士兵类
// 海军士兵类
public class NavySoldier extends Soldier {
public NavySoldier(String name) {
super(name);
}
@Override
public void attack() {
System.out.printf("海军士兵 %s 使用鱼雷射击", getName());
System.out.println();
}
}
4)军官类
// 军官类
public class Officer extends Soldier {
public Officer(String name) {
super(name);
}
@Override
public void attack() {
System.out.printf("军官 %s 使用手枪射击", getName());
System.out.println();
}
// 指挥团队(所有士兵和自己)一起行动
public void allAction(Soldier[] ss) {
for (int i = 0; i < ss.length; i++) {
ss[i].action();
}
}
// 指挥某一个士兵单独行动
public void singleAction(Soldier s) {
s.action();
}
}
5)测试
public class SoldierTest {
public static void main(String[] args) {
Officer officer = new Officer("李云龙"); // 军官
ArmySoldier armySoldier1 = new ArmySoldier("魏大勇"); // 陆军士兵1
ArmySoldier armySoldier2 = new ArmySoldier("张大彪"); // 陆军士兵2
NavySoldier navySoldier = new NavySoldier("田海洋"); // 海军士兵
System.out.println("*** 单个陆军士兵作战 ***");
officer.singleAction(armySoldier1);
officer.singleAction(armySoldier2);
System.out.println("*** 单个海军士兵作战 ***");
officer.singleAction(navySoldier);
System.out.println("*** 所有士兵和军官一起作战 ***");
Soldier[] ss = {armySoldier1,armySoldier2,navySoldier,officer};
officer.allAction(ss);
}
}
3、运行测试结果
*** 单个陆军士兵作战 ***
攻击准备...
陆军士兵 魏大勇 使用步枪射击
攻击完成...
攻击准备...
陆军士兵 张大彪 使用步枪射击
攻击完成...
*** 单个海军士兵作战 ***
攻击准备...
海军士兵 田海洋 使用鱼雷射击
攻击完成...
*** 所有士兵和军官一起作战 ***
攻击准备...
陆军士兵 魏大勇 使用步枪射击
攻击完成...
攻击准备...
陆军士兵 张大彪 使用步枪射击
攻击完成...
攻击准备...
海军士兵 田海洋 使用鱼雷射击
攻击完成...
攻击准备...
军官 李云龙 使用手枪射击
攻击完成...