Java数组继承混乱

时间:2018-03-27 00:54:40

标签: java inheritance

这是我第一次来这里,我会尝试让这篇文章变得正确。我正在为我的Java类处理继承问题。我有3个文件,DemoSugarSmash.java,SugarSmashPlayer.java和PremiumSugarSmashPlayer.java。

该程序适用于SugarSmashPlayer部分,但是当尝试在PremiumSugarSmashPlayer.java文件中创建数组时,它的长度不应超过10,而它的长度应为50。

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

该类包含以下字段:

玩家的整数ID号 字符串屏幕名称 一组整数,存储在10个游戏关卡中的每一个中获得的最高分数。 包括每个字段的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();
   }
}

2 个答案:

答案 0 :(得分:1)

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

要解决此问题,您需要弄清楚如何仅在SugarSmashPlayer中获得“分数”,但是数组的大小会因使用的类而异。

答案 1 :(得分:0)

解决问题的一种方法,也许是最好的方法,就是传递display()方法的声明/定义 SugarSmashPlayer和{{1} }类,以便您可以按照自己喜欢的方式对其进行更改,并根据要显示的内容覆盖它。

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

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

抽象思维可能会拯救你。

SugarSmashPlayer内部

super

PremiumSugarSmashPlayer内部

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();
   }