Java 数组继承混淆



这是我第一次来这里,我会努力把这篇文章做好。我正在为我的 Java 类做一个处理继承的练习。我有3个文件,DemoSugarSmash.java,SugarSmashPlayer.java和PremiumSugarSmashPlayer.java。

该程序在 SugarSmashPlayer部分正常工作,但是当尝试在 PremiumSugarSmashPlayer.java 文件中创建数组时,它的长度不会超过 10,而长度应该是 50

。以下是练习说明: 一个名为Sugar Smash的免费在线游戏的开发人员要求您开发一个名为SugarSmashPlayer的类,该类保存有关单个玩家的数据。

该类包含以下字段:

玩家的整数 ID 号 a 字符串屏幕名称 一个整数数组,用于存储 10 个游戏关卡中每个关卡中获得的最高分数。 包括每个字段的 get 和 set 方法。分数的 get 和 set 方法应分别需要两个参数,一个表示获得的分数,另一个表示要检索或分配的游戏级别。如果用户尝试从超出分数数组范围的级别分配或检索分数,则显示错误消息。

此外,除非用户在以前的每个级别至少获得 100 分,否则不应设置除第一个级别之外的任何级别。如果用户尝试为尚不可用的级别设置分数,请发出错误消息。

编写从 SugarSmashPlayer 衍生而来的类 PremiumSugarSmashPlayer。当用户支付 2.99 美元即可访问 40 个额外的游戏级别时,将实例化此类。与游戏的免费版本一样,除非用户在之前的所有级别都获得了至少 100 分,否则用户无法为某个级别设置分数。

我还没有为付费访问部分编码行。

// extend SugarSmashPlayer as PremiumSugarSmashPlayer here
public class PremiumSugarSmashPlayer extends SugarSmashPlayer
{
// declare private variables here
private int levels = 50;
private int[] scores = new int[levels];
public PremiumSugarSmashPlayer()
{
// add constructor code here
}
// override (public!) getLevels() method here
@Override
public int getLevels()
{
return levels;
}
}
public class SugarSmashPlayer
{
// add private varaibles here
protected int IDNumber;
protected String screenName;
private int levels = 10;
private int[] scores = new int[levels];
public SugarSmashPlayer()
{
// add constructor code here
}
public void setIdNumber(int num)
{
// add method code here
IDNumber = num;
}
public void setName(String player)
{
// add method code here
screenName = player;
}
public void setScore(int score, int level)
{
// add method code here
boolean goodScores = false;
if (level == 0)
// Set score to index 0
scores[level] = score;
else
{
// Check if  previous level score is greater than 100
if (scores[level - 1] > 100)
goodScores = true;
// Set score to game level
if (goodScores && level < scores.length)
scores[level] = score;
else
{
System.out.println("nInvalid score");
}
}
}
public int getIdNumber()
{
// add method code here
return IDNumber;
}
public String getName()
{
// add method code here
return screenName;
}
public int getScore(int level)
{
// add method code here
if (level >= scores.length)
{
System.out.println("Invalid game level");
return -1;
}
else
return scores[level];
}
public int getMinScore()
{
// add method code here
return 100;
}
public int getLevels()
{
// add method code here
return levels;
}
}
import java.util.*;
public class DemoSugarSmash
{
public static void main(String[] args)
{
SugarSmashPlayer ssPlayer = new SugarSmashPlayer();
ssPlayer.setIdNumber(1111);
ssPlayer.setName("Alex");
System.out.println("nAt start");
display(ssPlayer);       
ssPlayer.setScore(200, 0);
System.out.println("nAfter setting first score");
display(ssPlayer);
System.out.println("Trying to set fifth score too soon");
ssPlayer.setScore(30, 4);
System.out.println("nAfter setting second score");
ssPlayer.setScore(30, 1);
display(ssPlayer);
System.out.println("nTrying to set third score when second is too low");
ssPlayer.setScore(100, 2);
display(ssPlayer);
System.out.println("nAfter setting second, third, fourth, and fifth scores");
ssPlayer.setScore(100, 1);
ssPlayer.setScore(300, 2);
ssPlayer.setScore(400, 3);
ssPlayer.setScore(10, 4);
display(ssPlayer);
System.out.println("nTrying to set eleventh score");
ssPlayer.setScore(100, 10);
PremiumSugarSmashPlayer pssPlayer = new PremiumSugarSmashPlayer();
pssPlayer.setIdNumber(2222);
pssPlayer.setName("Cory");
System.out.println("nAt start");
display(pssPlayer);       
pssPlayer.setScore(200, 0);
System.out.println("nAfter setting first score");
display(pssPlayer);
System.out.println("Trying to set fifth score too soon");
pssPlayer.setScore(30, 4);
System.out.println("nAfter setting second score");
pssPlayer.setScore(30, 1);
display(pssPlayer);
System.out.println("nTrying to set third score when second is too low");
pssPlayer.setScore(100, 2);
display(pssPlayer);
System.out.println("nAfter setting second through tenth scores");
for(int x = 1; x < 10; ++x)
pssPlayer.setScore(130, x);
display(pssPlayer);
System.out.println("nTrying to set eleventh score");
pssPlayer.setScore(100, 10);
display(pssPlayer);
System.out.println("nTrying to set 51st score");
pssPlayer.setScore(100, 50);
display(pssPlayer);
}
public static void display(SugarSmashPlayer p)
{
System.out.println("   ID #" + p.getIdNumber() + "  Name: " +
p.getName());
for(int x = 0; x < p.getLevels(); ++x)
System.out.print("   " + p.getScore(x));
System.out.println();
}
}

我相信你的问题是SugarSmashPlayer和PremiumSugarSmashPlayer都有自己的私有"分数"数组,但是作用于分数的方法(如setScore)只存在于SugarSmashPlayer中,所以它们总是在SugarSmashPlayer的"分数"上运行。

要解决此问题,您需要弄清楚如何在SugarSmashPlayer中仅具有"分数",但数组的大小会根据所使用的类而有所不同。

解决它的一种方法,也许是最好的方法,是在SugarSmashPlayerPremiumSugarSmashPlayer传递display()方法的声明/定义,以便您可以按照自己喜欢的方式更改它并根据要显示的内容覆盖它。

这意味着您必须相应地更改类属性,以便 PremiumSugarSmashPlayer 可以拥有其所有父级 (SSP) 属性,并且仅使用super.levels = 50;更改需要区分的属性(级别、分数)。 但是,要实现这一目标,您必须在levels字段上具有访问权限,因此也许您可以在SugarSmashPlayer类上将其作为受保护的字段传递。

之后,您可以使用 PSSP 类中的super关键字重写 SSP 类的display()方法,然后毫无问题地使用它。

抽象思维可能会拯救你。

Inside the SugarSmashPlayer

public void display()
{
System.out.println("   ID #" + IDNumber + "  Name: " +
screenName);
for(int x = 0; x < levels; ++x)
System.out.print("   " + scores[x]);
System.out.println();
}

PremiumSugarSmashPlayer内部

public void display()
{     
super.display();
}

最新更新