Вопрос:

ошибка установщика при попытке доступа к методу дочернего класса в полиморфном массиве (Java)

java inheritance arraylist polymorphism

37 просмотра

1 ответ

27 Репутация автора

Я делаю программу с родительским классом Item и дочерними классами Game и Album, и я храню объекты в полиморфном массиве типа item в классе с именем library.

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

Я почти уверен, что это связано с тем фактом, что у меня есть массив элементов типа item, и я пытаюсь получить доступ к чему-то уникальному для класса Game, но я не знаю, как это решить. (Я обновил свой пост, у меня изначально был i.getAgeRating (newAgeRating) в моем методе editAgeRating, и я вернул его, чтобы установить. Я возился с ним, и я забыл изменить его обратно)

Помощь будет принята с благодарностью

Я выложу код ниже

public class Item {

private int id;
private String title;
private String genre;
private int yearReleased;

public Item() {

}

public Item(int id, String title, String genre, int yearReleased) {
    this.id = id;
    this.title = title;
    this.genre = genre;
    this.yearReleased = yearReleased;
}

public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getGenre() {
    return genre;
}

public void setGenre(String genre) {
    this.genre = genre;
}

public int getYearReleased() {
    return yearReleased;
}

public void setYearReleased(int yearReleased) {
    this.yearReleased = yearReleased;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((genre == null) ? 0 : genre.hashCode());
    result = prime * result + id;
    result = prime * result + ((title == null) ? 0 : title.hashCode());
    result = prime * result + yearReleased;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Item other = (Item) obj;
    if (genre == null) {
        if (other.genre != null)
            return false;
    } else if (!genre.equals(other.genre))
        return false;
    if (id != other.id)
        return false;
    if (title == null) {
        if (other.title != null)
            return false;
    } else if (!title.equals(other.title))
        return false;
    if (yearReleased != other.yearReleased)
        return false;
    return true;
}

public String toString() {
    return " | ID: " + id + " | Title: " + title + " | Genre:  " + genre + " | Year Released: " + yearReleased; 
}

}

public class Game extends Item{

private int ageRating;
private String developer;

public Game() {

}

public Game(int id, String title, String genre, int yearReleased, int ageRating, String developer) {

    super(id, title, genre, yearReleased);
    this.ageRating = ageRating;
    this.developer = developer;

    new Library(this);

}

public int getAgeRating() {
    return ageRating;
}

public void setAgeRating(int ageRating) {
    this.ageRating = ageRating;
}

public String getDeveloper() {
    return developer;
}

public void setDeveloper(String developer) {
    this.developer = developer;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = super.hashCode();
    result = prime * result + ageRating;
    result = prime * result + ((developer == null) ? 0 : developer.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (!super.equals(obj))
        return false;
    if (getClass() != obj.getClass())
        return false;
    Game other = (Game) obj;
    if (ageRating != other.ageRating)
        return false;
    if (developer == null) {
        if (other.developer != null)
            return false;
    } else if (!developer.equals(other.developer))
        return false;
    return true;
}

public String toString() {
    return "Game: " + super.toString() + " | Age Rating: " + ageRating + " | Developer: " + developer;
}

}

public class Library {

static ArrayList<Item> itemList = new ArrayList<Item>();

public Library(Item object) {
    itemList.add(object);
}

public static void printItems() {
    for(Item i: itemList) {
        System.out.println(i);
    }
}

public static void removeItem(int id) { 
    for(int i = itemList.size() -1 ; i > -1; i--) { // start backwards as problem removing when looping foreward
        if( id == itemList.get(i).getId() )
            itemList.remove(i);
    }
}

public static void editID(int searchId, int newId) {
    for(Item i: itemList) {
        if( i.getId() == searchId) {
            i.setId(newId);
        }
    }
}

public static void editTitle(int searchId, String newTitle) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setTitle(newTitle);
    }
}

public static void editGenre(int searchId, String newGenre) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setGenre(newGenre);
    }
}

public static void editYearReleased(int searchId, int newYearReleased) {
    for(Item i: itemList) {
        if( i.getId() == searchId);
            i.setYearReleased(newYearReleased);
    }
}

public static void editAgeRating(int searchId, int newAgeRating) {
    for (Item i: itemList) {
        if( i.getId() == searchId)
            i.setAgeRating(newAgeRating);
    }
}

}

Автор: AC Guns Источник Размещён: 08.11.2017 10:44

Ответы (1)


0 плюса

2808 Репутация автора

Решение

Я вижу, что в вашем коде более одной проблемы:

1) В вашем методе editAgeRating вы не вызываете метод установки, но вы в настоящее время вызываете метод получения. И в вашем классе такого метода нет (метод getAgeRating, который принимает параметр newAgeRating). Ваш метод получения не нуждается в параметре. Что означает, подписи методов разные.

2) В вашем методе editAgeRating при переборе списка элементов каждый отдельный объект обрабатывается как элемент, а не как объект Game.

Я думаю, что есть также неправильное понимание полиморфизма. Я предлагаю вам прочитать здесь .

Чтобы дать вам простой пример, все животные «двигаются». Однако птичья муха, рыба плавает, человек гуляет, хмель кролика, то есть каждый экземпляр животного реализует метод перемещения по-разному, хотя все они имеют метод перемещения.

Приветствия.

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

Там может быть более одного решения этой проблемы. Вот пара:

1) Определите Item как абстрактный класс и добавьте метод editAgeRating в этот класс как абстрактный метод.

2) Определите интерфейс, который имеет метод editAgeRating. Затем заставьте классы Item и Game реализовать этот интерфейс.

Автор: Alp Размещён: 08.11.2017 11:10
Вопросы из категории :
32x32