0

クラス名を使用してカードをリストに追加しようとしていますが、そのメソッドの 1 つを呼び出したいと考えています。どうやってやるの?私は今これを持っています:

スーパー クラス カードに:

public static ArrayList<Object> CreateAllCards() throws ClassNotFoundException
    {
        ArrayList<Object> cardArray = new ArrayList<>();

        for (int n = 0; n<cardList.length; n++)
        {
            if (isCardAllowedToBeCreated[n])
            {
                Class card = Class.forName(cardList[n]);
                cardArray.add(card);
            }
        }

        return cardArray;
    }

    static String[] cardList = {
        "CrtAbyssalSpecter",
        "CrtAirElemental",
        "ArtAladdinsRing",
        "SorAmbitionsCost",
        "CrtAnabaShaman",
        "CrtAngelOfMercy",
        "CrtAngelicPage",
        //...
    };
}

他の場所、私のメイン:

public static void main(String[] args) throws ClassNotFoundException {

    ArrayList<Object> cardList = Card.CreateAllCards();

    for (int n=0; n<cardList.size(); n++)
    {
        if (cardList.get(n) instanceof Creature)
        {
            // How to call a specific method?
        }
    }

}

また、私のように(各カード名で)オブジェクトの配列リストを作成するのではなく、各カード名を使用してカードの配列リストを直接作成する方法はありますか?

4

2 に答える 2

2

クラスを表すオブジェクトでリストを埋めています。それらのオブジェクトを作成していません。オブジェクトを作成するには、メソッドを呼び出しますnewInstance:

            Class card = Class.forName(cardList[n]);
            // Create object by calling the default no-arg constructor:
            cardArray.add(card.newInstance());

その後、他の回答ですでに提案されているように、キャストして特定のメソッドを呼び出すことができます:

    if (cardList.get(n) instanceof Creature)
    {
        Creature c = (Creature) cardList.get(n);
        c.creatureSpecificMethod();
    }

ただし、より優れた、より柔軟なオブジェクト指向のアプローチがあるかもしれません。これらの「カード」オブジェクトには共通点がありませんか? もしそうなら、おそらく同じインターフェースを実装するか、同じスーパークラスから継承するべきであり、「現在のカードがクリーチャーカードである場合は X を実行する」などのチェックは最小限に抑えることができます。「InstanceOf およびダウンキャストよりもポリモーフィズムを優先する」を参照してください。

アップデート:

のリストを作成するには、Cards次の変更が必要です: まず、リストを のリストとして宣言しますCard:

ArrayList<Card> cardArray = new ArrayList<>();

次に、 メソッドを使用しての結果をのサブクラスにasSubclass「キャスト」します。forNameCard

Class<? extends Card> card = Class.forName(cardList[n]).asSubclass(Card.class);
cardArray.add(card.newInstance());
于 2013-07-20T11:47:49.267 に答える
2

次のようにキャストを使用します。

public static void main(String[] args) throws ClassNotFoundException
{

    ArrayList<Object> cardList = Card.CreateAllCards();

    for(Object card : cardList)
    {
        if(card instanceof Creature)
        {
            Creature creature = (Creature) card;
            creature.creatureMethod();
        }
    }
}

さらに、forループ スタイルをより効率的なものに変更しましたfor each

于 2013-07-20T11:48:15.177 に答える