抽象类、内部类对于初学者来说,可能比较模糊,只停留在概念上,下面,就用
大家耳熟能详的DOTA中的操作来做简单说明。
一:要干什么?
用抽象类和内部类在描述DOTA中英雄释放4个技能的操作。
什么?你不知道有4个技能,那么.....你先去玩几把DOTA再说。
二:
英雄类-抽象类
所有英雄都要继承这个类,顺带用枚举表示了下四个技能。
[
java] package com.nbl;
import
java.util.HashMap;
import
java.util.Map;
public abstract class Hero {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**保存英雄的四个技能的触发动作**/
Map<ActionType, Action> lsa = new HashMap<Hero.ActionType, Action>();
/**添加技能的触发动作**/
void addListener(ActionType at,Action action){
lsa.put(at, action);
}
/**触发技能一**/
void A(){
lsa.get(ActionType.A).doit(this);
}
/**触发技能二**/
void B() throws Exception{
if(lsa.get(ActionType.B)== null ){
throw new Exception("未定义"+ActionType.B+"技能");
} else {
lsa.get(ActionType.B).doit(this);
}
}
/**触发技能三**/
void C(){
lsa.get(ActionType.C).doit(this);
}
/**触发技能四**/
void D(){
lsa.get(ActionType.D).doit(this);
}
enum ActionType{
//代表四个技能
http://www.atcpu.com/ A,B,C,D;
}
}
三:动作类-抽象类
每个技能都要执行,这个类中的一个doit方法
[
java]
package com.nbl;
public abstract class Action {
abstract void doit(Hero hero);
}
四:英雄实现类-非抽象类
英雄AM,未做扩展
[
java]
package com.nbl;
public class AM extends Hero{
}
五:看看如何使用执行吧
[
java]
package com.nbl;
import com.nbl.Hero.ActionType;
public class Test {
public static void main(String[] args) {
try {
AM am = new AM();
am.setName("敌法师");
am.addListener(ActionType.A, new Action() {
@Override
void doit(Hero hero) {
// TODO Auto-generated method stub
System.out.println(hero.getName()+"释放了技能"+ActionType.A);
}
});
am.A();
am.B();
} catch (Exception e) {
e.printStackTrace();
}
}
}
创建敌法师,给敌法师添加技能A的处理句柄。
然后执行A、B技能。
是不是感觉这种写法有点眼熟呢,呵呵
输出:
java.lang.Exception: 未定义B技能
敌法师释放了技能A
at com.nbl.Hero.B(Hero.
java:36)
at com.nbl.Test.main(Test.
java:26)