为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥6287543 2022-06-15 17:03:27
好的,所以我开始使用抽象类,但我有一个问题:我有这个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();}有没有办法自动执行此操作,或者只是更清洁?
查看完整描述

3 回答

?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

我提出了一种不同的方法:


你可以让你的抽象类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];

唯一的缺点是您必须将所有实现放入单个类文件中,这可能会变得非常混乱,很容易


查看完整回答
反对 回复 2022-06-15
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

对于问题的第一部分,以自动方式做这样的事情可能需要反思,但对于关于干净的第二部分,大多数人会发现它不是那么干净。


如果您同意将范围缩小到“扩展 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());

    }

}


查看完整回答
反对 回复 2022-06-15
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我会使用工厂模式。


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不大于您的列表。


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 547 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号