第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Java - 獲取擴(kuò)展抽象類的所有類

Java - 獲取擴(kuò)展抽象類的所有類

慕哥6287543 2022-06-15 17:03:27
好的,所以我開始使用抽象類,但我有一個(gè)問題:我有這個(gè)abstract class Quest。我的目標(biāo)是,在初始化一個(gè)new Quest對(duì)象時(shí),給它一個(gè)隨機(jī)Quest類型(由擴(kuò)展 Quest 的類表示)。現(xiàn)在我的代碼是:switch (r) {    case 0:        quest = new Bandit_Raids2();        break;    case 1:        quest = new Bandit_Raids();        break;    case 2:        quest = new Escort_Mission();}有沒有辦法自動(dòng)執(zhí)行此操作,或者只是更清潔?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊

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


你可以讓你的抽象類Questa enum,然后abstract在每個(gè)枚舉常量中實(shí)現(xiàn)方法(下面只是一個(gè)例子):


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

}

這樣你就可以隨機(jī)選擇一個(gè)枚舉常量(它是 的一個(gè)實(shí)例Quest):


Quest[] values = Quest.values();

int randomIndex = ThreadLocalRandom.current().nextInt(values.length);

Quest quest = values[randomIndex];

唯一的缺點(diǎn)是您必須將所有實(shí)現(xiàn)放入單個(gè)類文件中,這可能會(huì)變得非常混亂,很容易


查看完整回答
反對(duì) 回復(fù) 2022-06-15
?
回首憶惘然

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超11個(gè)贊

對(duì)于問題的第一部分,以自動(dòng)方式做這樣的事情可能需要反思,但對(duì)于關(guān)于干凈的第二部分,大多數(shù)人會(huì)發(fā)現(xiàn)它不是那么干凈。


如果您同意將范圍縮小到“擴(kuò)展 Quest 的所有類”,一個(gè)可能的解決方案是在 Quest 的所有子類上使用一些靜態(tài)初始化方法,以將它們自己注冊(cè)為可能的 Quest,并使用通用方法為它們創(chuàng)建實(shí)例就像是


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());

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-06-15
?
慕的地6264312

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超6個(gè)贊

我會(huì)使用工廠模式。


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


查看完整回答
反對(duì) 回復(fù) 2022-06-15
  • 3 回答
  • 0 關(guān)注
  • 473 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)