2015-05-02 78 views
0

我有一個名爲LotteryTicket的類,它有3個子類:Pick4,Pick5Pick6。我希望能夠調用方法public void pickNumbers()曾經被調用,將能夠識別正在使用哪個LotteryTicket子類並請求適量的參數(即在Pick5的實例中調用pickNumbers()將要求5個整數)。如何從Java中的繼承方法調用特定的重寫方法?

我已嘗試通過在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)); 
} 
+3

接受可變參數' public void pick(int ... args)'並且拋出IllegalArgumentException如果number無效 –

+0

你的代碼是否被編譯? – CKing

+0

@ChetanKinger如果OP按照他們的說法聲明'pick5Numbers'和'pick6Numbers',爲什麼不呢? –

回答

0

在我看來,這將是最好這樣做:

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

} 
0

如果你想從LotteryTicket延長,使pickNumbers()方法抽象並接受List Ø r可變參數:

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