[英]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.