Вызов метода подкласса в Java - PullRequest
0 голосов
/ 26 марта 2010

Учитывая следующую ситуацию (UML ниже),

Если у Y есть метод:

public void PrintWs();

и X имеет:

ArrayList <P> myPs = new ArrayList();

Y y = new Y();
Z z = new Z();
myPs.add(y);
myPs.add(z);

Как мне пройти через каждый объект myPs и вызвать все Ys PrintWs (без использования instanceof)?

http://starbucks.mirror.waffleimages.com/files/68/68c26b815e913acd00307bf27bde534c0f1f8bfb.jpg

Извините, чтобы уточнить:

  • Z содержит 1 объект Y.
  • Y и Z оба являются подклассами P
  • Изображение, кажется, работает, если вы обновляете - Моя репутация слишком низкая для загрузки изображений, поэтому я буду редактировать, когда наберу 15 баллов:)

Ответы [ 3 ]

1 голос
/ 26 марта 2010

Вы не можете - при условии, что вы хотите попробовать для вызова PrintWs в случаях Y, вам нужно определить, какие ссылки указывают на экземпляры Y .. и вот где вы используете instanceof. (Вы можете использовать Y.class.isInstance(p), но это то же самое в немного другой форме.)

Конечно, если вы можете сделать так, чтобы P содержал неактивную PrintWs, которая затем переопределяется в Y, вы можете вызвать его для всего списка ...

0 голосов
/ 26 марта 2010

Если Y и Z являются подклассами P, то вы можете переместить объявление метода в P с пустой реализацией и переопределить его в Y. Таким образом, вы можете вызывать метод для всех объектов в вашем ArrayList, но только для тех, которые являются экземпляры Y будут иметь реализацию для метода.

0 голосов
/ 26 марта 2010

Ну, вы могли бы попытаться понизить до Y в блоке try и поймать любой ClassCastException ... это не то, что я бы сделал в своем коде, но буквально воспринимается, отвечает вопрос: -)

Лучшим решением было бы переместиться вверх PrintWs() (с пустой реализацией по умолчанию) в класс P - тогда вы можете вызывать его для всех элементов myPs без снижения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...