2014-12-19 1 views
2

Я действительно смущен этим. После некоторых проблем с управлением отдельными HashMaps для каждого дочернего класса я решил попробовать использовать instanceof, чтобы упростить задачу с помощью класса HashMap класса Parent, который будет включать в себя любое количество дочерних классов. Я придумал этот тестовый код:Двойное выполнение команды с instanceof и HashMap

static HashMap <Integer, ant> antMap = new HashMap(); 

public static void main(String[] args) { 
    // ant is parent to antF, antSo, and antB 
    ant testSc = new ant(); 
    antF testF = new antF(); 
    antSo testS = new antSo(); 
    antB testB = new antB(); 

    antMap.put(testSc.ID, testSc); 
    antMap.put(testF.ID, testF); 
    antMap.put(testS.ID, testS); 
    antMap.put(testB.ID, testB); 
    ant grand = new ant(); 
    int loop = 0; 

    for (int s = 1; s < 5; s++){ 
     grand = antMap.get(s); 
     loop++; 
     if(grand instanceof ant){ 
      System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
     } 
     if(grand instanceof antF){ 
      antF work = (antF) grand; 
      System.out.println("type " + work.type + work.ID + "Loop " + loop); 
     } 
     if(grand instanceof antSo){ 
      System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
     } 
     if(grand instanceof antB){ 
      System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
     } 
    } 

я поставил счетчик цикла там, чтобы увидеть, если цикл был удвоение каким-то образом, но выход:

type Scout1Loop 1 
type Forager2Loop 2 
type Forager2Loop 2 
type Soldier3Loop 3 
type Soldier3Loop 3 
type Bala4Loop 4 
type Bala4Loop 4 

Я вижу родительский класс (помеченный здесь разведчик) выполняется правильно. Класс конструктора в мураве присваивает идентификатор на основе количества муравьев, поэтому Forager должен быть Forager2, Soldier должен быть Soldier3 и т. Д.

Я не могу на всю жизнь понять, почему дочерние классы выполняются дважды. Счетчик циклов показывает это.

Есть ли у кого-нибудь предложения?

Edit: вы можете видеть, что я пытался несколько различных вещей внутри для цикла, чтобы получить ожидаемые результаты)

(я стараюсь, чтобы пометить это в качестве домашнего задания, хотя это не конкретное решение)

..
+0

Можете ли вы показать определение класса для каждого типа? Как 'общественного класса муравей ...' и 'класса antF общественного ...' – Ascalonian

+0

Конструкторы следующим \t 'общественного муравей() { \t // муравьи всегда будут заштрихованы в узле Queen на 13,13 \t \t this.ID = ++ numberOfAnts; \t \t this.age = 0; \t \t this.type = "Scout"; \t \t this.x = 13; \t \t this.y = 13; \t \t это.lifespan = 3650; \t \t это.location = "1313"; \t} \t общественного antB() { \t \t супер(); \t \t this.type = "Bala"; \t} \t public antF() { \t \t super(); \t \t this.type = "Forager"; \t} \t public antSo() { \t \t super(); \t \t this.type = "Soldier"; \t} ' –

ответ

1

Один из способов получения вывода, который вы видите, состоит в том, чтобы иметь antF, antSo и andB все категории: ant. В этом случае, когда grand является экземпляром класса antF, следующие два значения if-s возвращают true: grand instanceof ant и grand instanceof antF.

Простой способ исправить это, чтобы изменить последние 3 if -s на else if -s или поставить continue в каждый из блоков if.

+0

Сначала я извиняюсь за плохо отформатированный код в ответе и не забываю сказать, что каждый класс действительно расширяет родительский класс муравьев. Я просто скопировал конструкторы, потому что у меня есть другие функции, некоторые довольно длинные, в дочерних классах. Но они действительно расширяются. –

+0

Пример подписи: public class antB extends ant { –

0

Проблема в том, что ваши классы расширяются ant. Помните, что в значительной степени означает «есть». Например: public class Dog extends Animal означает «Собака» - это «Животное».

Учитывая, что он всегда будет выполнять первый оператор if, а затем соответствующий под ним. Чтобы решить эту проблему, сделайте все одно крупное заявление if-else и поместите в качестве последнего утверждения значение if для grand instanceof ant. Так вот так ...

if(grand instanceof antF){ 
    antF work = (antF) grand; 
    System.out.println("type " + work.type + work.ID + "Loop " + loop); 
}else if(grand instanceof antSo){ 
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
}else if(grand instanceof antB){ 
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
}else if(grand instanceof ant){ 
    System.out.println("type " + grand.type + grand.ID + "Loop " + loop); 
} 
+0

Большое вам спасибо за ответ Ascalonian! Это очень помогло с несколькими различными аспектами программы. Ваше объяснение вызвало момент эврики. Извинения за поздний ответ, но я определенно хотел, чтобы вы знали, что это так помогло! –

+0

Рад, что это помогло! Лучший способ выразить признательность - проголосовать за мой ответ :) – Ascalonian

Смежные вопросы