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.