/*游戏模拟:兵种包括轰炸机、直升机、重型坦克、轻型坦克、步兵、飞行兵
轰炸机、直升机、飞行兵属于空军;其他属于陆军
轰炸机、轻型坦克、步兵只能攻击陆军;直升机、重型坦克、飞行兵可对空和对地;
模拟:构造一组兵种(各方混在一起),模拟相互间攻击的可能
*/
把题意用图来表示更为直观:
interface 陆军{;} //空方法体,仅起到标签作用
interface 空军{;}
interface 可对地攻击{
default void attack(陆军 x){ //默认方法(至少JDK1.8版)
System.out.print("可以攻击陆军");
}
}
interface 可对空攻击{
default void attack(空军 x) {
System.out.print("可以攻击空军");
}
}
interface 可对地对空攻击 extends 可对地攻击,可对空攻击{;}
abstract class 兵种{
private String type;
public String getType(){ return type;}
public 兵种(String s) { type=s;}
public abstract void attack(兵种 x); //所有兵种都能攻击
public String attackInfo(兵种 x) { //给出兵种相互攻击时的输出信息
return type+"攻击"+x.getType();
}
}
abstract class 飞行器 extends 兵种 implements 空军{
public 飞行器(String s) { super(s);}
}
class 轰炸机 extends 飞行器 implements 可对地攻击{
public 轰炸机() { super("轰炸机");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
System.out.print("不能攻击!");
}
}
class 直升机 extends 飞行器 implements 可对地对空攻击{
public 直升机() { super("直升机");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
if(x instanceof 空军) {
attack((空军)x); return;
}
System.out.print("不能攻击!");
}
}
abstract class 坦克 extends 兵种 implements 陆军{
public 坦克(String s) { super(s);}
}
class 重型坦克 extends 坦克 implements 可对地对空攻击{
public 重型坦克() { super("重型坦克");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
if(x instanceof 空军) {
attack((空军)x); return;
}
System.out.print("不能攻击!");
}
}
class 轻型坦克 extends 坦克 implements 可对地攻击{
public 轻型坦克() { super("轻型坦克");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
System.out.print("不能攻击!");
}
}
abstract class 士兵 extends 兵种{
public 士兵(String s) { super(s);}
}
class 步兵 extends 士兵 implements 陆军,可对地攻击{
public 步兵() { super("步兵");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
System.out.print("不能攻击!");
}
}
class 飞行兵 extends 士兵 implements 空军,可对地对空攻击{
public 飞行兵() { super("飞行兵");}
public void attack(兵种 x) {
System.out.print("\n"+attackInfo(x)+":");
if(x instanceof 陆军) {
attack((陆军)x); return;
}
if(x instanceof 空军) {
attack((空军)x); return;
}
System.out.print("不能攻击!");
}
}
class App{
public static void main(String [] args) {
兵种 [] obj = {new 重型坦克(), new 重型坦克(), new 轻型坦克(),
new 轰炸机(),new 直升机(), new 步兵(),new 轻型坦克(),
new 轰炸机(),new 直升机(), new 步兵()};
int i,j;
for(i=0,j=obj.length-1;i<obj.length;i++,j--)
obj[i].attack(obj[j]);
}
}
/*注:在轰炸机类中:
* 接口“可对地攻击”有方法:attack(陆军 x),这个方法不是抽象方法,可缺省
* 所以,在此类中可以不实现attack(陆军 x)
* 但,轰炸机是“兵种”的子类,中有抽象方法:attack(兵种 x)
* 所以在此类中需实现attack(兵种 x)
* 其它类同理
* */