2016-03-06 70 views
0

我试图在游戏中设计类法术。如何设计一个类层次结构,该类层次结构在不实例化的情况下提供有关子类的信息

首先我有一个spelbook,这表明该法术可用于该球员

public class Player { 
    private List<Class<? extends Spell>> speellBook; 
} 

现在我创造了一些法术

public abstact class Spell { 
    public abstact double getDmg(); 
    private double position x; 
    private double position y; 
} 
public class FireBolt extends Spell { 
    public double getDmg() { return 15; } 
} 
public class FrostBolt extends Spell { 
    public double getDmg() { return 10; } 
} 

现在我想展现一个关于提示玩家FireBolt,这表明这个法术在没有实例化的情况下会造成15点伤害。它应该只在玩家真正投射时实例化。

我已经想到了静态字段,但静态字段不能被真正的法术超越。

然后我想到了一个单例模式的,但因为我的当前位置存储在我的法术,也这将不工作,要么

是否有标准模式为这个?我只发现原型模式,但我需要一个单身它不会被继承

+1

我认为你正在反思这一点,只是在玩家中存储咒语实例 – 2016-03-06 20:57:26

+0

如果某个咒语的特定实例的伤害没有改变,引入一个静态变量来表示它有什么不对?即:对于FireBolt引入一个静态变量'fireboltDamage' – Pubudu

+0

,因为我的通用工具提示必须能够显示任何咒语 – wutzebaer

回答

2

您试图对类应用继承(统一调用getDmg方法在不同的法术上),避免对象实例化。正如你已经注意到的那样,这些需要静态字段和静态方法,但它们不适用于继承。我已经看过很多次了,并没有那种方式。

我建议创建模板对象并使用它们来显示工具提示。示例:

public class SpellTooltip { 

    private Map<Class<? extends Spell>, Spell> templates = new HashMap<>(); 

    { 
     templates.put(Firebolt.class, new Firebolt()); 
     templates.put(Frostbolt.class, new Frostbolt()); 
    } 

    public int getSpellDamage(Class<? extends Spell> clazz) { 
     return templates.get(clazz).getDmg(); 
    } 
} 

实现可能因设计的复杂性而异。按原样使用它,您应该始终记住向地图添加新类型。