Как я могу ссылаться на [не абстрактное] поле объекта, на который ссылается класс, который он расширяет? - PullRequest
1 голос
/ 30 декабря 2011

То есть у меня есть список класса 'Entity', который является абстрактным классом, содержащим несколько разных классов.В списке я могу определить, какие из определенных классов-потомков, используя

if (list[i] instanceof Enemy)

Однако я не могу, используя ссылку list[i], ссылочные поля, которые относятся к Enemy и не наследуются.

Есть ли какой-нибудь простой способ получить ссылку на него, который позволит мне ссылаться на определенные поля?

В противном случае я просто переписываю эту структуру кода.

Решено:Явный кастинг:

(Enemy)(list[i])

Ответы [ 5 ]

3 голосов
/ 30 декабря 2011

Вы должны вручную привести объект к Enemy:

((Enemy)(list[i])).enemyField

Возможно, вам удастся опустить некоторые из этих притязаний, в которых я никогда не уверен.

Также обратите внимание, что если вы выполняете много кастинга, это может быть признаком того, что ваш дизайн может нуждаться в некотором улучшении. Приведение не позволяет вам воспользоваться возможностями безопасности типов компилятора ... можете ли вы скрыть доступ к этим полям с помощью метода, который объявлен абстрактно в классе Entity?

1 голос
/ 30 декабря 2011

Если объект, хранящийся в вашем списке, является экземпляром Enemy, вы попадете в свой оператор if и сможете безопасно использовать его как: (Enemy) list[i]

1 голос
/ 30 декабря 2011

Вы можете привести элемент к соответствующему классу.

Enemy enemy = (Enemy)element; 
int hitPoints = enemy.getHitPoints(); 

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

0 голосов
/ 30 декабря 2011

«Правильный» подход - использовать дженерики:

List<Enemy> enemies = new ArrayList<Enemy>();
...
enemies.add(new EnemySubClass()); // etc
...
for (Enemy enemy : enemies) {
    enemy.someEnemyMethod();
}
0 голосов
/ 30 декабря 2011

Если someMethod является методом в классе Enemy,

if( list[i] instanceof Enemy ){
  ((Enemy) list[i] ).someMethod();
}
...