2014年4月9日 星期三

練習 6:多型

續練習 5。若某客戶同時擁有活期帳戶與定期存款帳戶,而要同時查詢帳戶餘額。試以多型實作

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else
   balance += money;
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  try{
    if (money < 50000)
     throw new ArithmeticException("例外狀況:定期存款最少需 50,000 元");
  }catch(Exception e){
     System.out.println(e.toString());
  }
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
   demandDepositAcc.deposit(500);
   demandDepositAcc.withdraw(300);
   System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
   
   FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(20000);   
   System.out.println("定期賬戶餘額:" + fixedDepositAcc.inquiry());

   Account account = demandDepositAcc;
   System.out.println("活期賬戶餘額2:" + account.inquiry());
   account = fixedDepositAcc;
   System.out.println("定期賬戶餘額2:" + account.inquiry());
   
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果








當然,可以將此測試檔案改寫為

檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   Account account = new DemandDepositAccount(1000);
   ((DemandDepositAccount) account).deposit(500);
   ((DemandDepositAccount) account).withdraw(300);
   System.out.println("活期賬戶餘額2:" + account.inquiry());
   
   account = new FixedDepositAccount(50000);
   System.out.println("定期賬戶餘額2:" + account.inquiry());  
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果

沒有留言:

張貼留言