簡體   English   中英

Java-獲取擴展抽象類的所有類

[英]Java - Getting all the classes that extend an Abstract Class

好的,所以我開始使用Abstract類,但是我有一個問題:我有這個abstract class Quest 我的目標是在初始化new Quest對象時,給它一個隨機的Quest類型(由擴展Quest的類表示)。 現在我的代碼是:

switch (r) {
    case 0:
        quest = new Bandit_Raids2();
        break;
    case 1:
        quest = new Bandit_Raids();
        break;
    case 2:
        quest = new Escort_Mission();
}

有什么方法可以自動執行此操作,或者只是更清潔?

我提出了另一種方法:

您可以將抽象類Quest一個enum ,然后在每個枚舉常量中實現abstract方法(下面僅是一個示例):

public enum Quest {
    ESCORT_MISSION {
        public void start(){/* escort something */}
    },
    BANDIT_RAIDS{
        public void start(){/* raid bandits */}
    },
    BANDIT_RAIDS2{
        public void start(){/* raid bandits, again */}
    };

    public abstract void start();

    // add here other methods and/or constructors and/or fields
}

這樣,您就可以隨機選擇一個枚舉常量(這是Quest一個實例):

Quest[] values = Quest.values();
int randomIndex = ThreadLocalRandom.current().nextInt(values.length);
Quest quest = values[randomIndex];

唯一的缺點是,您必須將所有實現都放入一個類文件中,該文件可能會變得很亂,很容易

對於問題的第一部分,以自動方式進行此類操作可能需要反思,但是對於第二部分,大多數人會發現它不是那么清潔。

如果您同意縮小“擴展Quest的所有類”的范圍,可能的解決方案是在Quest的所有子類上都具有一些靜態初始化方法,以將其自身注冊為可能的Quest並采用通用的方式為其創建實例就像是

public abstract class Quest {
    private static final List<Supplier<Quest>> suppliers = new ArrayList<>();

    protected static void register(Supplier<Quest> questSupplier) {
        suppliers.add(questSupplier);
    }

    public static Quest createQuest(){
        int r = 0; // replace by the random call you want there
        return suppliers.get(r).get();
    }
}




public class BanditQuest extends Quest{
    static {
        Quest.register(() -> new BanditQuest());
    }
}

我會使用工廠模式。

public abstract class Quest {
    // some generic code
}

public class BanditQuest extends Quest {
    // some specific code
}

public interface Factory {
    Quest create();
}

public class BanditFactory implements Factory {
    @Override
    public Quest create() {
        return new BanditQuest();
    }
}

List<Factory> factories = new ArrayList<Factory>();
factories.add(new BanditFactory());
// add all factories here

Quest quest = factories.get(r).create();

但是,您需要確保r不大於列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM