2014-12-03 3 views
0

У меня есть суперкласс и подкласс. И в суперклассе я пытаюсь получить переменную из подкласса с помощью метода. У меня есть 2 подкласса, и каждый подкласс имеет разные значения для этой переменной. Как мне это сделать? Вот как это выглядит:Метод суперкласса получает переменную подкласса

public class SuperClass{ 

protected int health; 

public int getHealth() 
{ 
    return health; 
} 

А потом у меня подклассы:

public class SubClass1 extends SuperClass{ 

private int health = 30; 

public SubClass1() { 
    super(); 
} 
} 

public class SubClass2 extends SuperClass{ 

private int health = 50; 

public SubClass2() { 
    super(); 
} 
} 

А потом я пытаюсь проверить это с помощью JTestUnit:

public class SubClass1{ 

@Test 
public void testGetHealth() 
{ 
    SubClass1 unit = new SubClass1(); 
    assertEquals(unit.getHealth(), 30); 
} 

Но это не Работа. Как получить значение в зависимости от того, что я создаю объект SubClass1 или SubClass2 (экземпляр?)? Заранее спасибо!

+0

Прежде всего, классы начинаются с буквы CAPITAL и почему subclass1 (null), когда ему не нужны параметры. это ваша домашняя работа? –

+0

Нет, это не так. Теперь я редактировал Q. – Fjondor

+0

Ваш тест проверяет, является ли здоровье 10? –

ответ

3

Удалить

private int health = 30; 

который объявляет новую переменную, чье имя скрывает переменную в родительском классе.

И инициализировать в конструкторе (ы)

public SubClass2() { 
    super(); 
    health = 30; 
} 
+0

. Я смотрю на этот ответ и ответ ниже этого, и какой из них лучше? У меня будет метод «setHealth», поэтому я думаю, что делать это лучше, так как это произойдет только один раз? Пожалуйста, объясните преимущества этого, потому что мне сказали, что я не должен переопределять методы. – Fjondor

+1

Я думаю, что это лучший подход, если вы хотите объявить переменную в суперклассе. Чтобы использовать приведенный ниже код, вы бы лучше удалили переменную из суперкласса и добавили «public abstract int getHealth()»; метод. – BarrySW19

+0

@ BarrySW19 подводит итог. Два или более поля «здоровье» могут вводить в заблуждение. Моя IDE, к счастью, дает предупреждение «поле скрывает другое поле класса предков» (или так). В качестве альтернативы вы можете создать конструктор суперкласса с параметром 'health' и do' this.health = health; ', а в дочерних классах -' super (30); '. –

1

Вы должны переопределить метод getHealth() для каждой подгруппы класса, т.е.

public class SuperClass{ 
    protected int health; 

    public int getHealth() { 
     return health; 
    } 
} 


public class SubClass{ 
    private int health; 

    public int getHealth() { 
     return health; 
    } 
} 

public class SubClass{ 
    public int getHealth() { 
     return super.getHealth() * 2; 
    } 
} 

Пожалуйста, обратите внимание, что

  1. Я переименовал ваши классы, которые должны начинаться с заглавной буквы по соглашению.
  2. Реализация getHealth в первом случае использует свою собственную переменную, а во втором случае - getHealth() суперкласса и умножает его на 2. Это просто пример использования.

РЕДАКТИРОВАТЬ

Очевидно, что эта конструкция хороша для нетривиальных реализаций методов, то есть, когда способ осуществления определенной логики. В вашем случае вы можете просто передать health через конструктор:

public class SuperClass{ 
    protected int health; 
    public SuperClass(int health) { 
     this.health = health; 
    } 
    public int getHealth() { 
     return health; 
    } 
} 


public class SubClass1{ 
    public SuperClass1(int health) { 
     super(health); 
    } 
} 

public class SubClass2{ 
    public SuperClass2(int health) { 
     super(health); 
    } 
} 

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

SuperClass c1 = new SuperClass(1); 
SuperClass c2 = new SuperClass(2); 
+0

Извините, 'getHealth()'. – AlexR

+0

Мне сказали попытаться избежать переопределения методов, пожалуйста, посмотрите мой комментарий под ответом другого парня. – Fjondor

+0

. Пожалуйста, см. Дополнительную информацию в нижней части моего ответа. – AlexR

0

вы должны возвращаться this.health, если вы хотите, чтобы значение конкретного объекта для здоровья.

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