Tài khoản ngân hàng
Giới thiệu ● Mô phỏng một số loại tài khoản ngân hàng thường gặp ● Mục tiêu kiến thức: – Kế thừa (inheritance) – Đa hình (polymorphism) – Đóng gói (encapsulation)
Bạn đang xem nội dung tài liệu Tài khoản ngân hàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Tài khoản ngân hàng
Lê Hồng Phương
phuonglh@gmail.com
Khoa Toán-Cơ-Tin học,
Trường Đại học Khoa học Tự nhiên, ĐHQG Hà Nội
2012-2013 Object-Oriented Programming: Bank Accounts 2
Nội dung
● Giới thiệu
● Đặc tả
● Thiết kế
● Cài đặt
2012-2013 Object-Oriented Programming: Bank Accounts 3
Giới thiệu
● Mô phỏng một số loại tài khoản ngân hàng
thường gặp
● Mục tiêu kiến thức:
– Kế thừa (inheritance)
– Đa hình (polymorphism)
– Đóng gói (encapsulation)
2012-2013 Object-Oriented Programming: Bank Accounts 4
Đặc tả
● Ngân hàng cung cấp cho khách hàng các loại tài
khoản sau:
– Tài khoản vãng lai, còn gọi là tài khoản séc: không
có lãi suất, mỗi tháng được miễn phí một số lượng
nhỏ giao dịch, các giao dịch bổ sung phải trả phí.
– Tài khoản tiết kiệm: có lãi hàng tháng theo một lãi
suất được ấn định trước.
2012-2013 Object-Oriented Programming: Bank Accounts 5
Phân tích
● Mọi loại tài khoản đều cần hỗ trợ các chức năng
sau:
– Truy vấn số dư tài khoản
– Nạp tiền vào và rút tiền ra khỏi tài khoản
– Chuyển tiền giữa hai tài khoản
● Tài khoản vãng lai cần có chức năng trừ phí giao
dịch.
● Tài khoản tiết kiệm cần có chức năng tính và trả
lãi.
2012-2013 Object-Oriented Programming: Bank Accounts 6
Thiết kế: Sơ đồ lớp
2012-2013 Object-Oriented Programming: Bank Accounts 7
Thiết kế: BankAccount
● Mỗi BankAccount có một số dư (balance)
– Chú ý: một số ngân hàng cho phép số dư âm.
● Các thao tác trên tài khoản:
– Truy vấn số dư: double getBalance().
– Nạp tiền: void deposit(double)
– Rút tiền: void widthraw(double)
– Chuyển tiền tới tài khoản khác: void transfer(double,
BankAccount)
2012-2013 Object-Oriented Programming: Bank Accounts 8
Thiết kế: CheckingAccount
● Mỗi CheckingAccount cần có khả năng theo dõi số
lần giao dịch được thực hiện trên tài khoản (rút tiền,
nạp tiền) để tính phí.
– Có thêm trường dữ liệu int transactionCount
● Cần sửa đổi hành vi của các thao tác rút tiền, nạp
tiền sao cho mỗi lần tài khoản thực hiện các thao tác
đó thì sẽ tăng transactionCount lên thêm 1.
● Có thêm phương thức trừ phí giao dịch:
– void deductFees()
2012-2013 Object-Oriented Programming: Bank Accounts 9
Thiết kế: SavingAccount
● Mỗi SavingAccount cần có thêm thông tin về lãi suất
và chức năng cộng thêm tiền lãi cho tài khoản.
– Có thêm trường dữ liệu double interestRate
– Có thêm phương thức void addInterest()
2012-2013 Object-Oriented Programming: Bank Accounts 10
Thiết kế: Sơ đồ lớp
2012-2013 Object-Oriented Programming: Bank Accounts 11
Thiết kế: Sơ đồ lớp
● Quyền truy cập cho các trường/phương thức:
– Kí hiệu - chỉ private
– Kí hiệu + chỉ public
● Các trường dữ liệu đều được đặt là private.
● Các lớp con muốn truy cập vào các trường private của
lớp cha thì phải sử dụng các phương thức (public) của
lớp cha.
– Đảm bảo tính đóng gói và an toàn dữ liệu
– Cách gọi: super.methodName()
2012-2013 Object-Oriented Programming: Bank Accounts 12
Cài đặt
● Xem các tệp
– BankAccount.java
– CheckingAccount
– SavingAccount
– IConstants
– AccountTester
2012-2013 Object-Oriented Programming: Bank Accounts 13
Cài đặt: BankAccount
public class BankAccount {
private double balance;
public BankAccount() {
balance = 0;
}
public BankAccount(double initialBalance) {
balance = initialBalance;
}
public void deposit(double amount) {
balance = balance + amount;
}
public void withdraw(double amount) {
balance = balance - amount;
}
// more methods go here...
}
2012-2013 Object-Oriented Programming: Bank Accounts 14
Cài đặt: BankAccount
public class BankAccount {
// ...
public double getBalance() {
return balance;
}
public void transfer(double amount, BankAccount other) {
withdraw(amount);
other.deposit(amount);
}
} Trong thực tế, các phương
thức cần phải được
đồng bộ hóa.
2012-2013 Object-Oriented Programming: Bank Accounts 15
Cài đặt: CheckingAccount
public class CheckingAccount extends BankAccount {
private int transactionCount;
public CheckingAccount(double initialBalance) {
super(initialBalance);
transactionCount = 0;
}
public void deposit(double amount) {
transactionCount++;
super.deposit(amount);
}
public void withdraw(double amount) {
transactionCount++;
super.withdraw(amount);
}
// more methods go here...
}
Gọi phương thức nạp tiền
của lớp cha để nạp tiền.
Nếu không dùng
từ khóa super?
2012-2013 Object-Oriented Programming: Bank Accounts 16
Cài đặt: CheckingAccount
public class CheckingAccount extends BankAccount {
// ...
/**
* Deducts the accumulated fees and resets
* the transaction count.
*/
public void deductFees() {
if (transactionCount > IConstants.FREE_TRANSACTIONS) {
double fees = IConstants.TRANSACTION_FEE
*(transactionCount - IConstants.FREE_TRANSACTIONS);
super.withdraw(fees);
}
transactionCount = 0;
}
}
Các hằng số được lưu
trong giao diện
IConstants.
2012-2013 Object-Oriented Programming: Bank Accounts 17
Cài đặt: SavingAccount
public class SavingsAccount extends BankAccount {
private double interestRate;
public SavingsAccount(double rate) {
interestRate = rate;
}
public void addInterest() {
double interest = getBalance() * interestRate / 100;
deposit(interest);
}
}
2012-2013 Object-Oriented Programming: Bank Accounts 18
Cài đặt: AccountTester
public class AccountTester {
public static void main(String[] args) {
SavingsAccount momsSavings = new SavingsAccount(0.5);
CheckingAccount myChecking = new CheckingAccount(100);
momsSavings.deposit(10000);
momsSavings.transfer(2000, myChecking);
myChecking.withdraw(1500);
myChecking.withdraw(80);
momsSavings.transfer(1000, myChecking);
myChecking.withdraw(400);
momsSavings.addInterest();
myChecking.deductFees();
System.out.println("Mom's savings balance: " + momsSavings.getBalance());
System.out.println("Expected: 7035");
System.out.println("My checking balance: " + myChecking.getBalance());
System.out.println("Expected: 1116");
}
}