简体   繁体   中英

How do I call a specific overridden method from an inherited method in Java?

I have a class named LotteryTicket that have 3 subclasses: Pick4 , Pick5 , and Pick6 . I want to be able to call a method public void pickNumbers() where once called, will be able to recognize which LotteryTicket subclass is being used and ask for the appropriate amount of arguments (ie calling pickNumbers() in an instance of Pick5 will ask for 5 ints).

I've attempted to get around this by providing public void pick4Numbers(int firstPick, int secondPick, int thirdPick, int fourthPick) for 4, 5, and 6 in the LotteryTicket class, and having the pickNumbers() method call the appropriate method (which will get overridden) based on a field pickAmount . Unfortunately, this would entail having to provide arguments.

Here is the LotteryTicket class:

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 class:

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

If you want to extend from LotteryTicket , make pickNumbers() method abstract and accepting List or varargs:

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

then in implementation classes, eg 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
       }
   }
}

In my opinion it would be better to do like this:

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

}

And Pick4, Pick5 ... etc will be like this:

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

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM