Вызвать метод объекта из коллекции

246
21 июля 2017, 02:14

Имеются интерфейсы:

public interface Ancor {
void toShoot();//Дальний бой
void toDamage();//Ближний бой
}
public interface Mag {
void toBless();//Благословить отряд союзника
void magicDamage();//Атака магией
void toCurse();//Снять благословение у противника

}

public interface Warrior {
void toDamage();//Ближний бой

}

их реализуют следующие классы:

public class ElfAncor implements Ancor {
private Integer damage;
private  Integer hp = 100;
public ElfAncor() {
    System.out.println("Эльф - лучник создан!");
}
public Integer getDamage() {
    return damage;
}
public void setDamage(Integer damage) {
    this.damage = damage;
}
public Integer getHp() {
    return hp;
}
public void setHp(Integer hp) {
    this.hp = hp;
}
public void toShoot() {
    setDamage(7);
}
public void toDamage() {
    setDamage(3);
}
}

public class ElfWarrior implements Warrior {
private Integer damage;
private  Integer hp = 100;
public ElfWarrior() {
    System.out.println("Эльф - воин создан!");
}
public Integer getDamage() {
    return damage;
}
public void setDamage(Integer damage) {
    this.damage = damage;
}
public Integer getHp() {
    return hp;
}
public void setHp(Integer hp) {
    this.hp = hp;
}
public void toDamage() {
    setDamage(15);
}
}
public class ElfMag implements Mag {
private Integer damage;
private  Integer hp = 100;
public ElfMag() {
    System.out.println("Эльф - маг создан!");
}
public Integer getDamage() {
    return damage;
}
public void setDamage(Integer damage) {
    this.damage = damage;
}
public Integer getHp() {
    return hp;
}
public void setHp(Integer hp) {
    this.hp = hp;
}
public void toBless() {
}
public void magicDamage() {
    setDamage(10);
}
public void toCurse() {
}
}

Мне нужно из коллекции, содержащей данные объекты, получить доступ к методам объекта

 public static List firstTeam = new LinkedList();
 public ElfAncor elfAncor1, elfAncor2, elfAncor3;
public ElfMag elfMag1;
public ElfWarrior elfWarrior1, elfWarrior2, elfWarrior3, elfWarrior4;

firstTeam.add(elfAncor1 = new ElfAncor());
        firstTeam.add(elfAncor2 = new ElfAncor());
        firstTeam.add(elfAncor3 = new ElfAncor());
        firstTeam.add(elfMag1 = new ElfMag());
        firstTeam.add(elfWarrior1 = new ElfWarrior());
        firstTeam.add(elfWarrior2 = new ElfWarrior());
        firstTeam.add(elfWarrior3 = new ElfWarrior());
        firstTeam.add(elfWarrior4 = new ElfWarrior());

Как получить доступ к методам объекта?

Answer 1

Во-первых, не

public static List firstTeam = new LinkedList();

а

public static List<ElfAncor> firstTeam = new LinkedList<>();

возможно даже

public static List<Ancor> firstTeam = new LinkedList<>();

Иначе в коллекцию можно совать любые объекты, а не только с нужным типом.

Во-вторых, совершенно не ясна надпись

firstTeam.add(elfAncor1 = new ElfAncor());
firstTeam.add(elfAncor2 = new ElfAncor());
firstTeam.add(elfAncor3 = new ElfAncor());

Каким образом ты пытаешься одновременно создать объект, воткнуть в список и еще присвоить неизведанной переменной. Если ты записываешь в коллекцию, то и работай с ней.

firstTeam.add(new ElfAncor());
firstTeam.add(new ElfAncor());
firstTeam.add(new ElfAncor());

Например вот вывод hp всех эльфов:

for (ElfAncor elfAncor : firstTeam) {
    System.out.println(elfAncor.getHp());
}

Если так сильно хочется обратиться к конкретному объекту, то обращайся по индексу коллекции к примеру:

System.out.println(firstTeam.get(1).getHp());
Answer 2

Как я понял ты хочешь хранить в одной команде разных типов персонажей и вызывать их методы. Для этого можно наследовать все интерфейсы от одного и создавать лист этого интерфейса, когда необходимо расширять до необходимого наследного класса.

public interface ParentInterface {
    void gethp();
}
interface ChaildInterface1 extends ParentInterface {
}
interface ChaildInterface2 extends ParentInterface {
}
interface ChaildInterface3 extends ParentInterface {
}
class Warrior implements ChaildInterface1 {
@Override
public Integer getHP() {
    return 1;
}
@Override
public void getDemage() {
}
}

LinkedList<ParentInterface> list = new LinkedList();
    list.add(new Warrior());
    list.add(new Warrior());
    for (ParentInterface anPers : list) {
        System.out.println(anPers.getHP());
        if (anPers instanceof Warrior){
            ((Warrior) anPers).getDemage();
        }
    }
READ ALSO
JavaFX, не могу поставить иконку в TreeView

JavaFX, не могу поставить иконку в TreeView

Изображения видимы, но не ставятся на TreeItem:

462
checkout всех веток через интерфейс Idea

checkout всех веток через интерфейс Idea

Добрый день, коллегиВопрос следующего характера: имеется многомодульный Java-проект

262
Отображение полей в связе многие ко многим в Hibernate

Отображение полей в связе многие ко многим в Hibernate

У меня есть сущности "событие" и "участник"Связь многие-ко-многим

246
Подскажите что поправить в коде задачи про массивы

Подскажите что поправить в коде задачи про массивы

Дана задача - Cоздать двумерный массив из 7 строк по 4 столбца в каждой из случайных целых чисел из отрезка [-5;5]Вывести массив на экран

173