所以,在论坛上搜索了几个小时后,我找不到任何对我有帮助的东西,所以我来了。
我正在尝试制作一款大富翁风格的游戏,我正在制作游戏引擎类。我有一个"Board"类和一个"abstract Card"类,我用它们来制作其他几个类,如"HouseCard"、"Decision Card"one_answers"AirportCard"等。正如您所看到的,每个卡片类都有不同的方法和字段。我现在正试图创建游戏引擎类,我需要访问其中一些类的一些字段和方法,但我做不到。Eclipse给我的唯一可能的解决方案是在"Abstract Card"类中创建方法,并在子类中执行@Override,但这是不对的,因为我必须在所有其他类中实现这些方法,所以最终我在每个类中都会有30个方法,这是错误的。我提供了一些代码来了解我的意思,因为我已经对两个抽象布尔方法和一个int做了这个解决方案,但感觉已经错了。
这是卡片类:
public abstract class Card {
public Card() {
}
public void stringCard() {
}
public void setHolder(int holderID) {
}
public abstract Boolean hasOwner();
public abstract Boolean buyable();
public abstract int getBuyCost();
}
这是我使用的卡子类之一"HouseCard"类:
public class HouseCard extends Card{
public String cardName;
public int buycost, rent, h1, h2, h3, h4, hotel, mortgage, hcost;
public int holderID = -1;
public HouseCard(String cardName, int buycost, int rent, int h1, int h2, int h3, int h4, int hotel, int mortgage, int hcost) {
this.cardName = cardName;
this.buycost = buycost;
this.rent = rent;
this.h1 = h1;
this.h2 = h2;
this.h3 = h3;
this.h4 = h4;
this.hotel = hotel;
this.mortgage = mortgage;
this.hcost= hcost;
}
@Override
public void setHolder(int holderID) {
this.holderID = holderID;
}
@Override
public Boolean buyable() {
if (this.holderID == -1) {
return true;
}
else {
return false;
}
}
@Override
public Boolean hasOwner() {
if (this.holderID == -1) {
return false;
}
else {
return true;
}
}
@Override
public int getBuyCost() {
return buycost;
}
@Override
public void stringCard() {
System.out.println(" " + cardName + " (" + buycost + "$)");
System.out.println("");
System.out.println("Rent Pay -> " + rent + "$");
System.out.println("1st House -> " + h1 + "$");
System.out.println("2nd House -> " + h2 + "$");
System.out.println("3rd house -> " + h3 + "$");
System.out.println("4th house -> " + h4 + "$");
System.out.println("");
System.out.println("Hotel -> " + hotel + "$");
System.out.println("");
System.out.println("Mortgage -> " + mortgage + "$");
System.out.println("");
}
public String getCardName() {
return cardName;
}
}
这是我用来存储游戏中每个方块的棋盘类,对不同的牌使用不同的方法:
public class Board {
public ArrayList<Card> Cards;
public int numberBoard = 0;
public Board(){
this.Cards = new ArrayList<Card>();
}
public void addCard(String cardName, String cardDesc) {
Card card = new GeneralCard(cardName, cardDesc);
Cards.add(card);
numberBoard++;
}
public void addCard(String cardName, String cardDesc, Action action) {
Card card = new GeneralCard(cardName, cardDesc, action);
Cards.add(card);
numberBoard++;
}
public void addCardMulti(String cardName, int buycost, int pay1, int pay2, int mortgage) {
Card card = new MultiCard(cardName, buycost, pay1, pay2, mortgage);
Cards.add(card);
numberBoard++;
}
public void addCardAirport(String cardName, int buycost, int air1, int air2, int air3, int air4, int mortgage) {
Card card = new AirportCard(cardName, buycost, air1, air2, air3, air4, mortgage);
Cards.add(card);
numberBoard++;
}
public void addCardHouse(String cardName, int buycost, int rent, int h1, int h2, int h3, int h4, int hotel, int mortgage, int hcost) {
Card card = new HouseCard(cardName, buycost, rent, h1, h2, h3, h4, hotel, mortgage, hcost);
Cards.add(card);
numberBoard++;
}
}
这里有一些行,我必须使用子类Cards中的字段和方法。正如你在我使用抽象方法getBuyCost()
的第一行中看到的那样,它工作得很好,但在我使用getCardName()
的第二行中,它是一个只在子类中使用的方法,而没有在Card超类中使用,它不工作。
dashboard.Cards.get(Players.get(i).getSquare()).getBuyCost();
System.out.println(Players.get(i).getName() + " bought " + dashboard.getCard(Players.get(i).getSquare()).getCardName() + " successfully.");
我该怎么解决这个问题?
您的问题是getCardName()
方法没有在Card
类中定义。由于该变量看起来像是适用于所有子类的数据,我建议将其上移到父Card
类中。
public abstract class Card {
private String cardName;
public Card(String cardName) {
this.cardName = cardName;
}
public String getCardName() {
return cardName;
}
//Other methods
}
然后,子类可以在实例化时调用super()
方法来设置该值。
public class HouseCard extends Card {
public HouseCard(String cardName) {
super(cardName);
}
}
然后,在Card
对象上调用getCardName()
方法就不会有任何问题,因为您在Card
父类中定义了它。然后,您也可以在子类中调用getCardName()
方法来获取该上下文中的值(或者,如果您只想直接引用变量,则使用protected
关键字而不是private
(。
@Override
public String toString() {
return getCardName() + " some other info specific to this class";
}
首先,如果希望尊重封装并使用访问器方法,则应将HouseCard属性设置为私有属性。
第二,记得分享所有相关的代码,这样我们可以更好地帮助您。我假设Players.get(i).getSquare
在您的代码中返回HouseCard
的一个实例。
最后,如果square
属性的类型是Card
,那么在调用getCardName()
方法之前,您需要对HouseCard
进行强制转换。
你最终会得到这样的东西:
HouseCard card = (HouseCard) Player.get(i).getSquare();
String cardName = card.getCardName();