Chuyển tiền
Thuộc phần Lập trình hướng đối tượng trong hành trình Lua của Coddy. Bài học 24 trên 70.
Thử thách
DễNgân hàng kỹ thuật số của bạn gần hoàn thành! Tính năng lớn cuối cùng là chuyển tiền giữa các tài khoản. Đây là lúc thiết kế hướng đối tượng của bạn thực sự phát huy hiệu quả: một đối tượng tài khoản có thể tương tác trực tiếp với một đối tượng tài khoản khác.
Bạn sẽ thêm phương thức :transfer(targetAccount, amount) để chuyển tiền từ tài khoản này sang tài khoản khác. Hãy nghĩ xem thao tác này thực sự bao gồm những gì: rút tiền từ tài khoản nguồn, sau đó gửi tiền vào tài khoản đích. Điểm hay là bạn có thể dùng lại các phương thức mình đã xây dựng!
Tiếp tục xây dựng trên các tệp hiện có:
Account.lua: Thêm phương thức:transfer(targetAccount, amount)vào lớp Account. Phương thức này cần thử rút số tiền đó từself, rồi gửi số tiền đó vàotargetAccountnếu rút thành công. Nếu rút tiền không thành công (không đủ tiền), giao dịch chuyển tiền sẽ không diễn ra. Giữ nguyên mọi chức năng hiện có (hàm khởi tạo có ID, gửi tiền, rút tiền, getBalance và __tostring).main.lua: Tạo nhiều tài khoản và minh họa việc chuyển tiền giữa chúng, cho thấy số dư thay đổi như thế nào giữa các đối tượng tài khoản khác nhau.
Bạn sẽ nhận năm đầu vào:
- ID của tài khoản thứ nhất
- ID của tài khoản thứ hai
- Số tiền gửi ban đầu vào tài khoản thứ nhất
- Số tiền chuyển lần thứ nhất (từ tài khoản 1 sang tài khoản 2)
- Số tiền chuyển lần thứ hai (từ tài khoản 1 sang tài khoản 2)
Trong tệp chính, hãy tạo hai tài khoản có ID đã cho (cả hai đều bắt đầu với số dư 0), gửi số tiền ban đầu vào tài khoản thứ nhất, rồi thử thực hiện cả hai lần chuyển tiền từ tài khoản thứ nhất sang tài khoản thứ hai. Sau mỗi lần thử chuyển tiền, hãy in ra thông tin của cả hai tài khoản (__tostring sẽ hiển thị trạng thái hiện tại của chúng).
Ví dụ, nếu đầu vào là 101, 102, 500, 200 và 400, đầu ra sẽ là:
Account [101]: Balance = 300
Account [102]: Balance = 200
Insufficient funds
Account [101]: Balance = 300
Account [102]: Balance = 200Tài khoản thứ nhất có số dư 500 sau khi gửi tiền. Lần chuyển 200 thứ nhất thành công, tài khoản 101 còn 300 và tài khoản 102 có 200. Lần chuyển 400 thứ hai thất bại vì tài khoản 101 chỉ có 300, nên số dư của cả hai tài khoản đều không đổi.
Tự làm thử
-- Nạp module Account bằng require
local Account = require('Account')
-- Đọc năm đầu vào
local id1 = io.read()
local id2 = io.read()
local initialDeposit = tonumber(io.read())
local transfer1 = tonumber(io.read())
local transfer2 = tonumber(io.read())
-- Tạo hai tài khoản với ID
local account1 = Account:new(id1)
local account2 = Account:new(id2)
-- Nạp số tiền ban đầu vào tài khoản thứ nhất
account1:deposit(initialDeposit)
-- TODO: Thử chuyển tiền lần đầu từ account1 sang account2
-- TODO: In ra cả hai tài khoản sau lần chuyển tiền đầu tiên
-- TODO: Thử chuyển tiền lần thứ hai từ account1 sang account2
-- TODO: In ra cả hai tài khoản sau lần chuyển tiền thứ hai
Tất cả bài học trong Lập trình hướng đối tượng
1Khái niệm “self”
Bảng với hàm“self” tường minhCú pháp dấu hai chấmDấu chấm và dấu hai chấmÔn tập: Điểm chuyển động4Dự án: Ngân hàng số
Thiết lập dự ánPhương thức nạp tiền2Mẫu Prototype cho lớp
Khái niệm PrototypeLiên kết bằng __indexHàm khởi tạo :new()Khởi tạo thuộc tínhCác instance độc lậpÔn tập: Nhà máy ô tô5Nạp chồng toán tử trong OOP
Cộng các đối tượngTrừ các đối tượngNối các đối tượngSo sánh các đối tượng (<, >)Ôn tập: phép tính với ví tiền8Đóng gói
Quy ước đặt tênClosure để bảo mậtTruy cập qua closureBảng chỉ đọcLogic kiểm tra hợp lệTổng kết: Két an toàn11Mẫu thiết kế (cơ bản)
Hàm tạo đối tượngBảng SingletonMẫu IteratorObserver (Listener)Ôn tập: Factory Logger3Trạng thái và hành vi của đối tượng
Biến instancePhương thức getterPhương thức setterThuộc tính tính toánĐịnh dạng chuỗiKiểm tra tính bằng nhauÔn tập: điểm số học sinh6Cơ bản về kế thừa
Thiết lập kế thừaKế thừa phương thứcMở rộng hàm khởi tạoThêm phương thức cho lớp conDùng chung và riêngÔn tập: hệ phân cấp hình dạngTự luyện tập: Trình biên dịch Lua online