如何设计一个 class 层次结构,在不实例化的情况下提供有关子 class 的信息
How to design a class hierarchy which gives information about the subclasses without instantiating it
我正在尝试为游戏中的咒语设计类。
首先我有一个玩家有一本魔法书,它表明了这个玩家可以使用哪些法术
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 点伤害。它应该只在玩家真正施放时实例化。
我已经想到了静态场,但是静态场不能被真正的法术覆盖。
然后我想到了单例模式,但由于我也将当前位置存储在我的法术中,所以这也行不通
这有什么标准模式吗?我只找到了原型模式,但因为我需要一个单例,它不会被继承
您正在尝试为 类 应用继承(在不同的法术上统一调用 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();
}
}
实施可能因设计的复杂程度而异。按原样使用它,您应该始终记住向地图添加新类型。
我正在尝试为游戏中的咒语设计类。
首先我有一个玩家有一本魔法书,它表明了这个玩家可以使用哪些法术
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 点伤害。它应该只在玩家真正施放时实例化。
我已经想到了静态场,但是静态场不能被真正的法术覆盖。
然后我想到了单例模式,但由于我也将当前位置存储在我的法术中,所以这也行不通
这有什么标准模式吗?我只找到了原型模式,但因为我需要一个单例,它不会被继承
您正在尝试为 类 应用继承(在不同的法术上统一调用 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();
}
}
实施可能因设计的复杂程度而异。按原样使用它,您应该始终记住向地图添加新类型。