【问题标题】:How do I call a specific overridden method from an inherited method in Java?如何从 Java 中的继承方法调用特定的重写方法?
【发布时间】:2015-05-02 19:58:24
【问题描述】:

我有一个名为 LotteryTicket 的类,它有 3 个子类:Pick4Pick5Pick6。我希望能够调用方法public void pickNumbers()where 一旦被调用,将能够识别正在使用哪个 LotteryTicket 子类并要求适当数量的参数(即在 Pick5 的实例中调用 pickNumbers() 会问5 个整数)。

我试图通过在 LotteryTicket 类中为 4、5 和 6 提供 public void pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick) 来解决这个问题,并让 pickNumbers() 方法基于字段pickAmount。不幸的是,这需要提供论据。

这是LotteryTicket 类:

public class LotteryTicket
{
protected int pickAmount;
protected boolean isRandom;
protected ArrayList<Integer> numbersPicked;
protected Date datePurchased;
protected SimpleDateFormat sdf;

public LotteryTicket(int pickAmount, boolean isRandom)
{
    // INITIALIZATION OF VARIABLES
    this.pickAmount = pickAmount;
    this.isRandom = isRandom;

    // CONSTRUCTION OF ARRAYLIST
    numbersPicked = new ArrayList(pickAmount);

}

/**
 * The number pick method for ALL subclasses. Running this method will run the appropriate pickxNumbers
 * method, where x is the pickAmount.
 *
 */
public void pickNumbers()
{
    if(pickAmount == 4){
        pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick)
    }
    if(pickAmount == 5){
        pick5Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick, int fifthPick)
    }
    if(pickAmount == 6){
        pick6Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick, int fifthPick, int sixthPick)
    }
}

/**
 * The number pick method for the Pick4 subclass.
 *
 */
public void pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick)
{

}

Pick4类:

public class Pick4 extends LotteryTicket

{

/**
 * Constructor for objects of class Pick4
 */
public Pick4(boolean isRandom)
{
    super(4, isRandom);
}

/**
 * Overloaded pick4Numbers() method. Depending on the ticket type, the amount of picks will vary.
 * For example, Pick4 tickets will only ask for 4 int values, Pick5 tickets will ask for 5, etc.
 * 
 *@param int firstPick
 *@param int secondPick
 *@param int thirdPick
 *@param int fourthPick
 */
public void pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick)
{
    numbersPicked.add(new Integer(firstPick));
    numbersPicked.add(new Integer(secondPick));
    numbersPicked.add(new Integer(thirdPick));
    numbersPicked.add(new Integer(fourthPick));
}

【问题讨论】:

  • 接受可变参数public void pick(int... args),如果数字无效则抛出 IllegalArgumentException
  • 你的代码能编译吗?
  • @ChetanKinger 如果 OP 像他们所说的那样声明了 pick5Numberspick6Numbers,为什么不呢?
  • @SashaSalauyou if(pickAmount == 4){ pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick) }.
  • 选择值从何而来? (firstPick, secondPick, ...)

标签: java inheritance parameters overriding overloading


【解决方案1】:

在我看来,这样做会更好:

public class LotteryTicket {
   protected int pickAmount;
   protected boolean isRandom;
   protected List<Integer> numbersPicked;
   protected Date datePurchased;
   protected SimpleDateFormat sdf;

   protected int[] numbersToPick;

   //To create random valued ticket
   public LotteryTicket(int pickAmount) {
      this.pickAmount = pickAmount;
      isRandom = true;
   }

   //To create specified valued ticket
   public LotteryTicket(int... numbersToPick) {
      pickAmount = numbersToPick.length;
      isRandom = false;
      this.numbersToPick = numbersToPick;
   }

   public void pickNumbers() {
      numbersPicked = new ArrayList<>(pickAmount);
      if (isRandom) {
         Random random = new Random(System.currentTimeMillis());
         for (int i = 0; i < pickAmount; i++) {
            numbersPicked.add(random.nextInt());
         }
      } else {
         for (int i = 0; i < pickAmount; i++) {
            numbersPicked.add(numbersToPick[i]);
         }
      }
   }

}

而Pick4、Pick5 ...等会是这样的:

public class Pick4 extends LotteryTicket {

   //For random valued ticket  
   public Pick4() {
      super(4);
   }
   //For specified valued ticket    
   public Pick4(int pick1, int pick2, int pick3, int pick4) {
      super(pick1, pick2, pick3, pick4);
   }

}

【讨论】:

    【解决方案2】:

    如果您想从LotteryTicket 扩展,请将pickNumbers() 方法抽象化并接受List 或可变参数:

    public abstract class LotteryTicket {
       //...
       abstract public void pickNumbers(int... numbers);
       //...
    }
    

    然后在实现类中,例如。 G。 Pick4:

    public class Pick4 extends LotteryTicket {
       //...
       @Override
       public void pickNumbers(int... numbers) {
           if (numbers.length != 4) 
               throw IllegalArgumentException("For Pick4, there must be exactly 4 numbers!");
           for (int n : numbers) {
               numbersPicked.add(n); // no need in explicit boxing, Java will do it for you
           }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      相关资源
      最近更新 更多