Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何设计一个类层次结构,在不实例化子类的情况下提供有关子类的信息_Java_Class Design - Fatal编程技术网

Java 如何设计一个类层次结构,在不实例化子类的情况下提供有关子类的信息

Java 如何设计一个类层次结构,在不实例化子类的情况下提供有关子类的信息,java,class-design,Java,Class Design,我正在为游戏中的咒语设计课程 首先,我有一个带spelbook的玩家,它指示该玩家可以使用哪些法术 public class Player { private List<Class<? extends Spell>> speellBook; } 现在我想展示一个关于火弩的工具提示,显示这个法术在没有实例化的情况下造成15点伤害。它应该只在玩家真正施放它时实例化 我已经想到了一个静态场,但是静态场不能被真正的法术所覆盖 然后我想到了一个单例模式,但是由于我也在我的

我正在为游戏中的咒语设计课程

首先,我有一个带spelbook的玩家,它指示该玩家可以使用哪些法术

public class Player {
    private List<Class<? extends Spell>> speellBook;
}
现在我想展示一个关于火弩的工具提示,显示这个法术在没有实例化的情况下造成15点伤害。它应该只在玩家真正施放它时实例化

我已经想到了一个静态场,但是静态场不能被真正的法术所覆盖

然后我想到了一个单例模式,但是由于我也在我的法术中存储了当前位置,这也不会起作用


这个有什么标准图案吗?我只找到了原型模式,但sice我需要一个单例,它不可继承

您试图对类应用继承(在不同的拼写上统一调用
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();
    }
}
公共类拼写工具提示{

private Map您正在尝试对类应用继承(统一调用不同拼写的
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();
    }
}
公共类拼写工具提示{

private MapI我认为你想得太多了,只需将法术实例存储在玩家中。如果某个特定法术实例的伤害没有改变,那么引入一个静态变量来表示它有什么错?例如:对于FireBolt,引入一个静态变量
fireboltDamage
,因为我的通用工具提示必须能够显示一个法术的dmgYspell@RC.当玩家施法时,我应该克隆对象?克隆与否取决于对象的实现,如果它是无状态的,那么我会重新使用。我认为你想得太多了,只需在玩家中存储咒语实例。如果某个咒语实例的伤害没有改变,引入静态变量有什么错o指出它?例如:对于FireBolt,引入一个静态变量
fireboltDamage
,因为我的通用工具提示必须能够显示任何类型的dmgspell@RC.当玩家施法时,我应该克隆这个对象?克隆与否取决于对象的实现,如果它是无状态的,那么我会重用它。