簡體   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