Java抽象类、内部类详解

2014-11-24 07:51:07 · 作者: · 浏览: 1

抽象类、内部类对于初学者来说,可能比较模糊,只停留在概念上,下面,就用大家耳熟能详的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 lsa = new HashMap();

/**添加技能的触发动作**/
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{
//代表四个技能 www.2cto.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)



摘自 yasenagat的专栏