我正在制作一个包含父类Item的程序,以及子类Game和Album,并且我已经将这些对象存储在一个名为library的类中的类型item的多态arraylist中。
例如,我在游戏的子类中添加了一些变量,当我尝试通过一个名为editAgeRating的方法编辑游戏类特有的变量(称为ageRating)时,使用setter I'我得到一个错误。 eclipse说要在父类中添加方法,当我这样做时,仍然不会覆盖以前的ageRating变量。我非常确定这是因为我有一个类型项目的arraylist,我试图访问Game类的独特内容,但我不知道知道如何解决它。 (我已经更新了我的帖子,我最初在我的editAgeRating方法中使用了i.getAgeRating(newAgeRating)并且我已将它返回到设置。我正在搞乱它并且我忘了将其更改回来)
非常感谢帮助
我会在下面发布代码
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);
}
}
}
答案 0 :(得分:0)
我发现您的代码中存在多个问题:
1)在editAgeRating方法中,您没有调用setter,但是您当前正在调用getter。并且在您的类中没有这样的方法(getAgeRating方法接受newAgeRating参数)。你的getter方法不需要参数。这意味着,方法签名是不同的。
2)在editAgeRating方法中,在迭代项目列表时,将每个单独的对象视为一个Item,而不是Game对象。
我认为还存在对多态性的误解。我建议你阅读here。
举一个简单的例子,所有动物都“移动”。然而,鸟类飞行,鱼类游动,人类行走,兔子跳跃,即每个动物工具的移动方法都不同,尽管它们都有移动方法。
干杯。
修改
这个问题可能有多个解决方案。这是一对夫妇:
1)将Item定义为Abstract类,并将editAgeRating方法作为抽象方法添加到该类中。
2)定义一个具有editAgeRating方法的接口。然后让你的Item和Game类实现该接口。