灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3203回复:0

Java抽象类、内部类详解

楼主#
更多 发布于:2012-09-08 09:41

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




喜欢0 评分0
游客

返回顶部