如何使一个子类的字段和方法可用于只通过另一个类使用超级类的类



所以,在论坛上搜索了几个小时后,我找不到任何对我有帮助的东西,所以我来了。

我正在尝试制作一款大富翁风格的游戏,我正在制作游戏引擎类。我有一个"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();

相关内容

最新更新