Java抽象类、内部类详解
3777 点击·0 回帖
![]() | ![]() | |
![]() | 抽象类、内部类对于初学者来说,可能比较模糊,只停留在概念上,下面,就用大家耳熟能详的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) | |
![]() | ![]() |