0

我正在尝试使用它们的类名将卡片添加到列表中,然后我想调用它们的一种方法。我怎样才能做到这一点?我现在有这个:

进入超类卡:

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

不过,可能会有更好、更灵活、面向对象的方法。这些“卡片”对象没有任何共同点吗?如果他们这样做,他们可能应该实现相同的接口或从相同的超类继承,并且可以将诸如“当前卡是否是生物卡 do X”之类的检查保持在最低限度。请参阅“比 InstanceOf 和向下转换更喜欢多态性”。

更新:

要创建Cards您需要这些修改的列表:首先将列表声明为Card

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

然后使用该asSubclass方法将结果“转换”forName为 的子类Card

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 回答