繁体   English   中英

如何制作一个可以接受任何类型参数的 Java 类

[英]How to make a Java class that can take parameters of any type

我正在制作一个处理游戏中任务的插件。 我有一个 Quest 类,它是 Quest 的实例,它附加到玩家的对象。 我可以得到任务,检查它的目标,哪些是完整的,哪些不是等等。

我有四种类型的目标(谈话、杀死实体、收集物品、制作物品)。 这存储在枚举中。 我试图弄清楚如何使我的目标类尽可能高效,这将需要我用目标类型然后目标(要与之交谈的 NPC 或要收集的物品等)来初始化目标类,但是根据ObjectiveType,目标将是不同的类型。

例如: Objective newObjective = new Objective(ObjectiveType.TALK, NPC(10)); 将创建一个目标,告诉玩家与 ID 为 10 的 NPC 交谈

Objective newObjective = new Objective(ObjectiveType.COLLECT_ITEM, Item(ZOMBIE_ESSENCE)); 会创建一个目标,告诉玩家收集一个僵尸精华。

任何帮助深表感谢。

枚举还不能有自己的泛型类型(我认为有一个 JSR)。 这意味着您不能真正将ObjectiveType及其参数联系在一起。 否则,您可以将Objective设为通用:

// this is not possible yet
enum ObjectiveType<T> {
    TALK<NPC>,
    COLLECT_ITEM<Item>,
    ...
}

class Objective<T> {
    public Objective(ObjectiveType<T> type, T argument) { ... }
}

但是,您可以轻松地将构造函数设为私有并使用工厂方法:

public static Objective newTalkObjective(NPC npc) {
    return new Objective(ObjectiveType.TALK, npc);
}

public static Objective newCollectItemObjective(Item item) {
    return new Objective(ObjectiveType.COLLECT_ITEM, item);
}

假设 NPC 和 item 是类,我可以想到多种方法来做到这一点: 创建多个构造函数:

public Objective(NPC npc){
...
}

public Objective(Item item){
...
}

使用的构造函数还将指示目标的类型。 所以,没必要传进去。

第二种方法是让 NPC 和 Item 扩展一个基类。 这样,您将只需要一个用于 Objective 的构造函数,第二个参数是基类的类型。

但是,恕我直言,正确的做法实际上是将 Objective 作为基类并为每种类型的目标扩展它。 这将使代码更清晰。 任何共享值和方法都将放在基类中,每个目标类型的特定值和方法将放在子类中。

它还将使将来添加更多目标类型变得更加容易,因为您所要做的就是创建另一个扩展目标的类。

想法 1 - Objective的子类

任何Objective实例都与Event实例非常相似。

EventBus 的一个常见设计是使用子类树来描述任何EventType

如果您对整个 Objective 模块进行足够的抽象,这应该是有效的: BaseObjectiveEntityObjectiveMonsterObjectiveKillMonsterObjective ...

class Objective
{
  ObjectiveType type;
  public Objective(ObjectType type) { this.type = type; }
}

class ObjectiveKillTarget extends Objective
{
  TargetType typeTarget; // any extra parameters
  public ObjectiveKillTarget(TargetType typeTarget)
  {
    super(ObjectiveType.KILL_TARGET);
    this.typeTarget = typeTarget;
  }
}

想法 2 - 将键值对存储在Map<String, ?>或类似的东西中

如果您确实想将所有数据存储到 ONE 类的实例中, Map<String, ?>可能会有所帮助。

不推荐但有效。

暂无
暂无

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

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