[英]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 作为基类并为每种类型的目标扩展它。 这将使代码更清晰。 任何共享值和方法都将放在基类中,每个目标类型的特定值和方法将放在子类中。
它还将使将来添加更多目标类型变得更加容易,因为您所要做的就是创建另一个扩展目标的类。
Objective
的子类任何Objective
实例都与Event
实例非常相似。
EventBus 的一个常见设计是使用子类树来描述任何EventType
。
如果您对整个 Objective 模块进行足够的抽象,这应该是有效的: BaseObjective
, EntityObjective
, MonsterObjective
, KillMonsterObjective
...
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;
}
}
Map<String, ?>
或类似的东西中如果您确实想将所有数据存储到 ONE 类的实例中, Map<String, ?>
可能会有所帮助。
不推荐但有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.