Java - 获取扩展抽象类的所有类

好的,所以我开始使用抽象类,但我有一个问题:我有这个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();

}

有没有办法自动执行此操作,或者只是更清洁?


慕哥6287543
浏览 548回答 3
3回答

一只斗牛犬

我提出了一种不同的方法:你可以让你的抽象类Questa 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 {&nbsp; &nbsp; private static final List<Supplier<Quest>> suppliers = new ArrayList<>();&nbsp; &nbsp; protected static void register(Supplier<Quest> questSupplier) {&nbsp; &nbsp; &nbsp; &nbsp; suppliers.add(questSupplier);&nbsp; &nbsp; }&nbsp; &nbsp; public static Quest createQuest(){&nbsp; &nbsp; &nbsp; &nbsp; int r = 0; // replace by the random call you want there&nbsp; &nbsp; &nbsp; &nbsp; return suppliers.get(r).get();&nbsp; &nbsp; }}public class BanditQuest extends Quest{&nbsp; &nbsp; static {&nbsp; &nbsp; &nbsp; &nbsp; Quest.register(() -> new BanditQuest());&nbsp; &nbsp; }}

慕的地6264312

我会使用工厂模式。public abstract class Quest {&nbsp; &nbsp; // some generic code}public class BanditQuest extends Quest {&nbsp; &nbsp; // some specific code}public interface Factory {&nbsp; &nbsp; Quest create();}public class BanditFactory implements Factory {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Quest create() {&nbsp; &nbsp; &nbsp; &nbsp; return new BanditQuest();&nbsp; &nbsp; }}List<Factory> factories = new ArrayList<Factory>();factories.add(new BanditFactory());// add all factories hereQuest quest = factories.get(r).create();不过,您需要确保r不大于您的列表。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java