繁体   English   中英

没有抽象类的抽象方法

[英]Abstract methods without abstract classes

我是Java的新手,我正在尝试编写各种RPG。

现在,在游戏中,玩家角色将具有技能。 这些可能非常多样化,从伤害敌人到治愈玩家等等。 用抽象的applyEffect()方法创建一个Skill类是有意义的,该方法将在每个特定技能上定义。

但是,我不能有一个包含抽象方法的非抽象类,并且每个技能都应该是Skill类的对象,因此它不能是抽象的。 显而易见的解决方案是使Skill类成为抽象类,并为每个技能创建一个子类, 然后将其实例化为要使用的对象。 这种方法似乎有点多余。 在这种情况下,我还能想到什么呢?

编辑:当我们在它的时候,如果我想要一个将与标准变量一起出现的对象,是否有任何变通方法可以只为那个对象创建一个类,然后实例化它?

这个怎么样:

public abstract class Skill {
    public abstract void applyEffect();
}


... somewhere else ... 
Skill dig = new Skill() {
    @Override
    public void applyEffect() {
        doSomeDigging();
    }
};

这个仍然在后台创建一个子类,但是您可能会更喜欢它。

我不会将技能(例如“治愈”和“隐藏”)编写为课程。 我将类视为对象(玩家),将方法视为能力(技能)。 像“治愈”或“隐藏”这样的技能显然比类更好。

我只想拥有一个包含所有方法的类,但是只有选定的方法可供使用。 具有枚举技能也不是一个坏主意。

enum Skill {
    HEAL, HIDE, ATTACK, THROW
}

class Player {
    boolean canHeal = false;
    boolean canHide = false;
    boolean canAttack = false;
    boolean canThrow = false;

    Player(Skill[] skills) {
        for(skill : skills) {
            switch(skill) {
                case Skills.HEAL: canHeal = true;
                break;

                case Skills.HIDE: canHide = true;
                break;

                case Skills.ATTACK: canAttack = true;
                break;

                case Skills.THROW: canThrow = true;
                break;

                default: //error
            }
        }
    }

    void heal() {
        [...]
    }
    void hide() {
        [...]
    }
    void attack() {
        [...]
    }
    void throw() {
        [...]
    }
    boolean canHeal() {
        return canHeal;
    }
    boolean canHide() {
        return canHide;
    }
    boolean canAttack() {
        return canAttack;
    }
    boolean canThrow() {
        return canThrow;
    }
}

现在,可以限制播放器仅使用应提供给他们的方法。 我可能要做的是编写一个GameHandler类来处理所有事情并在那里进行所有检查。

我也将使用枚举,您可以在其中填充一些登录信息。 这些地图使每个玩家都能拥有所需的任何技能和数据。 您可以像这样那样嵌套枚举。

import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
public class So36107587 {
    enum Stat {
        food,health,magic;
    }
    enum Skill {
        heal,hurt,hunt;
        static void apply(Skill skill,double amount,Player player) {
            double a=amount*random.nextDouble(),x;
            switch(skill) {
                case heal:
                    x=player.stats.get(Stat.health);
                    player.stats.put(Stat.health,a+x);
                    break;
                case hurt:
                    x=player.stats.get(Stat.health);
                    player.stats.put(Stat.health,a-x);
                    break;
                case hunt:
                    x=player.stats.get(Stat.food);
                    player.stats.put(Stat.food,a+x);
                    break;
            }
        }
        static final Random random=new Random();
    }
    static class Player {
        Player() {
            init();
        }
        void init() {
            for(Stat stat:Stat.values())
                stats.put(stat,1.);
            for(Skill skill:Skill.values())
                skills.put(skill,1.);
        }
        void apply(Skill skill,Player player) {
            Skill.apply(skill,skills.get(skill),player);
        }
        @Override public String toString() {
            return ""+skills+" "+stats;
        }
        final Map<Stat,Double> stats=new TreeMap<>();
        final Map<Skill,Double> skills=new TreeMap<>();
    }
    public static void main(String[] args) {
        Player player=new Player();
        System.out.println(player);
        player.apply(Skill.heal,player);
        System.out.println(player);
        player.apply(Skill.hunt,player);
        System.out.println(player);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM