2013-12-01 3 views
0

У меня есть задание из класса Java 1 (я новичок), и этот вопрос дает нам указание сделать код более объектно-ориентированным. Я сделал все, что мог для задания, но один из моих файлов постоянно дает мне ошибку Cannot Find Symbol Method, даже если файлы находятся в одном проекте. Я знаю, что методы есть, так что происходит? Ошибка возникает только в AlienPack, которая, похоже, не распознает другие файлы, все из которых находятся в одном проекте (включая AlienPack). Метод getDamage(), который вызывается в AlienPack, не найден (находится в SnakeAlien, OgreAlien и т. Д.).Не удается найти ошибку метода символа

EDIT: Новая ошибка для методов getDamage(), которые я пытаюсь вызвать в AlienPack, заключается в том, что методы все еще не найдены. AlienDriver не может найти calculateDamage().

Вот код, который я получил до сих пор:

Иностранец:

public class Alien { 
// instance variables 
private String name; 
private int health; 

// setters 
public void setName(String n) { 
    name = n; } 

public void setHealth(int h) { 
    if(h>0&&h<=100) { 
     health = h; 
    } else { 
     System.out.println("Error! Invalid health value!"); 
     System.exit(0); } } 

// getters 
public String getName() { 
    return name; } 

public int getHealth() { 
    return health; } 

// constructors 
public Alien() { 
    setName("No name"); 
    setHealth(100); } 

public Alien(String n, int h) { 
    setName(n); 
    setHealth(h); } 

public Alien(Alien anAlien) { 
    setName(anAlien.getName()); 
    setHealth(anAlien.getHealth()); } 

public Alien clone() { 
    return new Alien(this); 
} } 

SnakeAlien:

public class SnakeAlien extends Alien { // new file 
// instance variables 
private int damage; 

// setters 
public void setDamage(int d) { 
    if(d>0) { 
     damage = d; 
    } else { 
     System.out.println("Error! Invalid damage value!"); 
     System.exit(0); } } 

// getters 
public int getDamage() { 
    return damage; } 

// constructors 
public SnakeAlien() { 
    super(); 
    setDamage(0); } 

public SnakeAlien(String n, int h, int d) { 
    super(n, h); 
    setDamage(d); } 

public SnakeAlien(SnakeAlien anAlien) { 
    super(anAlien); 
    setDamage(anAlien.getDamage()); } 

public SnakeAlien clone() { 
    return new SnakeAlien(this); 
} } 

OgreAlien:

public class OgreAlien extends Alien { // new file 
// instance variables 
private int damage; 

// setters 
public void setDamage(int d) { 
    if(d>0) { 
     damage = d; 
    } else { 
     System.out.println("Error! Invalid damage value!"); 
     System.exit(0); } } 

// getters 
public int getDamage() { 
    return damage; } 

// constructors 
public OgreAlien() { 
    super(); 
    setDamage(0); } 

public OgreAlien(String n, int h, int d) { 
    super(n, h); 
    setDamage(d); } 

public OgreAlien(OgreAlien anAlien) { 
    super(anAlien); 
    setDamage(anAlien.getDamage()); } 

public OgreAlien clone() { 
    return new OgreAlien(this); 
} } 

MarshmallwManAlien:

public class MarshmallowManAlien extends Alien { // new file 
// instance variables 
private int damage; 

// setters 
public void setDamage(int d) { 
    if(d>0) { 
     damage = d; 
    } else { 
     System.out.println("Error! Invalid damage value!"); 
     System.exit(0); } } 

// getters 
public int getDamage() { 
    return damage; } 

// constructors 
public MarshmallowManAlien() { 
    super(); 
    setDamage(0); } 

public MarshmallowManAlien(String n, int h, int d) { 
    super(n, h); 
    setDamage(d); } 

public MarshmallowManAlien(MarshmallowManAlien anAlien) { 
    super(anAlien); 
    setDamage(anAlien.getDamage()); } 

public MarshmallowManAlien clone() { 
    return new MarshmallowManAlien(this); 
} } 

AlienPack:

public class AlienPack { // new file, this one isn't recognizing the others 
// instance variables 
private Alien[] pack; 

// setters 
public void setPack(Alien[] aliens) { 
    pack = new Alien[aliens.length]; 
    for(int i = 0; i<aliens.length; i++) { 
     pack[i]=aliens[i].clone(); } } 

// getters 
public Alien[] getPack() { 
    Alien[] temp = new Alien[pack.length]; 
    for(int i = 0; i<pack.length; i++) { 
     temp[i]=pack[i].clone(); } 
    return temp; } 

// constructors 
public AlienPack() { 
    Alien[] nothing = new Alien[1]; 
    nothing[0]=null; 
    setPack(nothing); } 

public AlienPack(Alien[] aliens) { 
    setPack(aliens);} 

// other methods 
public int calculateDamage() { 
    int damage = 0; 
    for(int i = 0; i<pack.length; i++) { 
     if((new SnakeAlien()).getClass()==pack[i].getClass()) { 
      pack[i].getDamage() +=damage; 
     } else if((new OgreAlien()).getClass()==pack[i].getClass()) { 
      pack[i].getDamage() +=damage; 
     } else if((new MarshmallowManAlien()).getClass()==pack[i].getClass()) { 
      pack[i].getDamage() +=damage; 
     } else { 
      System.out.println("Error! Invalid object!"); 
      System.exit(0); } }  
    return damage; } } 

AlienDriver:

public class AlienDriver { // driver class 
public static void main(String[] args) { 

    Alien[] group = new Alien[5]; 
    group[0]= new SnakeAlien("Bobby", 100, 10); 
    group[1]= new OgreAlien("Timmy", 100, 6); 
    group[2]= new MarshmallowManAlien("Tommy", 100, 1); 
    group[3]= new OgreAlien("Ricky", 100, 6); 
    group[4]= new SnakeAlien("Mike", 100, 10); 

    System.out.println(group.calculateDamage()); 

}}

+1

Опубликовать ** вся ** ошибка. –

ответ

0

Я думаю, что по крайней мере часть вашей проблемы является getClass() метод. Вы ожидаете, что он вернет объект, но это не так. Просто позвоните непосредственно в массив.

pack[I].getDamage() 

должен работать при условии, что правильный тип объекта хранится в упаковке()

1

две проблемы:

pack[i].getClass().getDamage() ... 

должен быть только

pack[i].getDamage() ... 

Вы, кажется, путают о том, что делает getClass() способ. Он возвращает объект, который представляет класс (т. Е. java.lang.Class) другого объекта. Он используется для отражения. Чтобы вызвать getDamage(), вы просто вызываете его непосредственно на pack[i], как показано выше.

Однако ...

Вы пытаетесь вызвать метод getDamage() используя ссылку типа Alien, который является базовым классом для всех конкретных чужеродных видов.Если вы хотите сделать это таким образом, getDamage() должен быть объявлен abstract в базовом классе, чтобы его можно было найти и отправить в правильный подкласс при вызове с помощью ссылки Alien.

В Alien:

public abstract class Alien { 
    ... 
    public abstract int getDamage(); 

Альтернативой является приведение к соответствующему подклассу в каждой точке, так как вы знаете, что это такое:

((SnakeAlien)pack[i]).getDamage() +=damage; 

Однако (опять же), даже, что это неправильно. Вы не можете применить += к «rvalue». Что вам нужно сделать здесь является:

  1. также объявить setDamage() абстрактную в Alien и сделать pack[i].setDamage(pack[i].getDamage()+damage);
  2. Если литье, ((SnakeAlien)pack[i]).setDamage(((SnakeAlien)pack[i].getDamage()) + damage);

Моя рекомендация:

В классе чужеродным:

public abstract class Alien { 
    ... 
    private int damage = 0; // Move damage up to the abstract base class 
    public int addToDamage(int n) { this.damage += n; } 
    ... 
} 

В вашем драйвере нет необходимости тестировать класс. Вызовите метод addToDamage() по ссылке Alien.

+0

После удаления getClass() у меня появляется ошибка «Неожиданный тип». Кроме того, создание Alien abstract приводит к тому, что мой метод overridden clone() не работает. Компилятор говорит, что метод clone() не может быть создан. – user3053612

+0

См. Мой обновленный ответ –

+0

Тип-литьевый пакет [i] дает мне ошибку компилятора «Неожиданный тип», а второе решение делает компилятор «Оператор +» не применим к SnakeAlien, int. Мой учитель - приверженец использования того, что мы знаем, и только то, что мы знаем до сих пор в классе, поэтому я не могу использовать абстрактный. – user3053612

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