Sổ cái ngân hàng
Thuộc phần Lập trình hướng đối tượng trong hành trình Kotlin của Coddy. Bài học 57 trên 57.
Thử thách
KhóXây dựng một ngân hàng nhỏ.
BankError(message)là một lớp sealed kế thừaException, với các lớp conInvalidAmount(invalid amount),Insufficient(id)(insufficient funds in 2),WithdrawalLimit(id)(withdrawal limit on 2) vàNoAccount(id)(no account 9).Account(id, owner)là lớp trừu tượng. Mọi nơi đều có thể đọcbalance, nhưng chỉ các lớp tài khoản mới có thể thay đổi thuộc tính này.deposit(amount)vàwithdraw(amount)némInvalidAmountnếu số tiền nhỏ hơn 1, cònwithdrawnémInsufficientkhi số dư sẽ giảm xuống dướilowestBalancecủa tài khoản. Lớp này khai báokindtrừu tượng và phương thức mởmonthEnd(), phương thức này không làm gì cả.Checkingcho phép thấu chi xuống đến -100.Savingskhông bao giờ có số dư dưới 0, cho phép tối đa 2 lần rút tiền mỗi tháng (WithdrawalLimit) và trongmonthEnd(), cộng thêm lãi suất 1% (làm tròn xuống) rồi đặt lại số lần rút tiền.Bankcóopen(kind, id, owner),account(id)(némNoAccount),transfer(from, to, amount), phương thức này tìm cả hai tài khoản trước rồi mới rút tiền và gửi tiền,monthEnd()áp dụng cho mọi tài khoản vàaccounts()sắp xếp tài khoản theo id.
Code được cung cấp đọc các lệnh open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 hoặc month, in ra ok hoặc thông báo lỗi, rồi cuối cùng in ra mọi tài khoản theo định dạng 1 ada checking: -20.
Code của bạn nằm trong các tệp BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt và Bank.kt. Main.kt chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.
Tự làm thử
fun main() {
// Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
val input = generateSequence(::readLine).toList()
val bank = Bank()
for (cmd in input) {
val p = cmd.split(" ")
try {
when (p[0]) {
"open" -> bank.open(p[1], p[2].toInt(), p[3])
"dep" -> bank.account(p[1].toInt()).deposit(p[2].toInt())
"wd" -> bank.account(p[1].toInt()).withdraw(p[2].toInt())
"tr" -> bank.transfer(p[1].toInt(), p[2].toInt(), p[3].toInt())
else -> bank.monthEnd()
}
println("ok")
} catch (e: BankError) {
println(e.message)
}
}
for (a in bank.accounts()) println("${a.id} ${a.owner} ${a.kind}: ${a.balance}")
}
Tất cả bài học trong Lập trình hướng đối tượng
1Lớp và đối tượng
Làm việc với tệpĐịnh nghĩa lớpHàm khởi tạo chínhKhối init và kiểm tra tính hợp lệHàm khởi tạo phụÔn tập: thẻ thư viện4Kế thừa
Lớp mở và lớp conGhi đè thành viênsuper và hàm khởi tạoLớp trừu tượngÔn tập: Danh bạ nhân viên2Thuộc tính và tính đóng gói
Trình truy cập tùy chỉnhBộ sửa đổi phạm vi truy cậpSetter riêng tưlazy và lateinitÔn tập: tài khoản ngân hàng5Giao diện
Khai báo giao diệnPhương thức mặc địnhNhiều giao diệnGiao diện như kiểu dữ liệuÔn tập: Phương thức thanh toánTự luyện tập: Playground Kotlin