0

我有一个包含 6 个子类的超类。我有一个带有字符串键和子类集合值的哈希图。我正在定义一种方法,该方法可以将超类作为参数并将其放入哈希图中的正确集合中。为了找到正确的密钥,我使用“istanceof”。现在,当我尝试将超类参数添加到未锁定的密钥时,我希望(我实际上无法编译我的程序)会出现编译时错误,因为我没有强制转换。我不能让变量引用一个类。据我所知,它需要引用一个对象。我可以参考Class<Subclass>. 但我仍然无法从那里取得进展。

    public void addCard(AttackCard card) {
    String category = null;
    AttackCard type = null; <-- I would like to make this refer to e.g. Assassin
    if (card instanceof Assassin) {
        category = "assassins";
    }if (card instanceof Fighter) {
        category = "fighters";
    }if (card instanceof Mage) {
        category = "mages";
    }if (card instanceof Marksman) {
        category = "marksmen";
    }if (card instanceof Support) {
        category = "supports";
    }if (card instanceof Tank) {
        category = "tanks";
    }
    attackPool.get(category).get(card.getTier()).add(card)
}

2点需要注意:

1)子类是抽象的,不能初始化?

2)我的哈希图实际上是HashMap<String, Hashmap<Enum, ArrayList<Subclass>>>

那么我应该如何将我的卡施放为特定的子类?

4

3 回答 3

1

添加一个名为的新枚举CardType,它将具有值Assassin等,Fighter然后向您的卡类添加一个新方法getType()

class AttackCard{
  CardType type;

  ...

  CardType getType(){
     return type;
  }

}

然后你可以把你的Map<String, map<Enum, ArrayList<Subclass>>>变成一个Map<CardType, map<Enum, List<AttackCard>>>

attackPool.get(card.getType()).get(card.getTier()).add(card)

在相关的注释中,在类型声明中强制 Map 和 List 实现不是一个好习惯,因为这样您以后将无法更改它并且可能会暴露实现细节。

例如,而不是HashMap<String, Hashmap<Enum, ArrayList<Subclass>>>你应该 make it Map<String, map<Enum, List<Subclass>>>

此外,如果您在地图中的键是枚举,则使用 anEnumMap而不是更有效HashMap

于 2013-10-24T20:23:45.623 回答
1

鲍里斯是正确的。

为简单起见,只需将一个添加addToPool(Map<String, EnumMap <Enum, List<AttackCard >>> pool)到您的 AttackCard 类并在每个子类中实现它以将其添加到正确的类别中。

说了这么多,说几句。

铸造很少是一个好主意,并且通常表示设计问题。

我并没有真正看到将卡片存储在不同子图中的兴趣,因为您必须在检索它时强制转换它(以便调用子类特定方法)。(如果不将整个池限制为仅此子类,则不能将子图列表键入为子类)。

如果我是你,我会将池设计为具有多个类型属性的对象List<PeculiarSubclass>

否则,这与泛型无关,我真的不明白如何在层次结构的底部拥有抽象类。只有 AttackCard 应该是抽象的或接口

于 2013-10-24T22:23:52.223 回答
0

我不确定我是否理解,但也许这就是你需要的:

public void addCard(AttackCard card) {
    String category = null;
    if (card instanceof Assassin) {
    category = "assassins";
       Assassin type = (Assassin) card;
       // Other code using card as Assassin
    } else if (card instanceof Fighter) {
        category = "fighters";
        Fighter type = (Fighter) card;
       // Other code using card as Fighter
    } else if ...

然而,这看起来很奇怪。我不知道您要完成什么,但我认为您需要更好地了解如何使用继承(或澄清您想要做什么)。

于 2013-10-24T20:34:59.267 回答