Ôn tập: phương thức thanh toán
Thuộc phần Lập trình hướng đối tượng trong hành trình Ruby của Coddy. Bài học 36 trên 57.
Thử thách
KhóXây dựng quy trình thanh toán bằng tính đa hình, phương thức trừu tượng và duck typing. PaymentMethod#charge(amount) là một phương thức mẫu: phương thức này trả về nil khi available?(amount) là false, nếu không thì trả về card paid 50.00, fee 1.00, sử dụng label và fee(amount) trừu tượng, vốn sẽ phát sinh NotImplementedError trong PaymentMethod. available? là một hook trả về true. Card tính phí 2%; PayPal tính 0.30 cộng thêm 3%; GiftCard.new(balance) không tính phí, chỉ khả dụng khi số dư đủ để thanh toán số tiền và sẽ giảm số dư. Voucher.new(value) không phải là PaymentMethod: đối tượng này chỉ có charge(amount) riêng, trả về voucher covered 20.00 khi giá trị đủ để thanh toán số tiền và trả về nil nếu không đủ. Hàm trợ giúp checkout(amount, methods) trong functions.rb lần lượt thử phương thức charge của từng phương thức thanh toán và trả về kết quả đầu tiên, hoặc declined.
Dòng đầu tiên của đầu vào liệt kê các phương thức thanh toán, chẳng hạn như gift:30,voucher:20,card. Mỗi dòng tiếp theo là số tiền của một đơn hàng; code được cung cấp sẽ in kết quả của checkout cho từng đơn hàng.
Code của bạn nằm trong các tệp payment_method.rb, card.rb, pay_pal.rb, gift_card.rb, voucher.rb và functions.rb. main.rb chứa code đầu vào/đầu ra được cung cấp và không thể chỉnh sửa.
Tự làm thử
require_relative 'payment_method'
require_relative 'card'
require_relative 'pay_pal'
require_relative 'gift_card'
require_relative 'voucher'
require_relative 'functions'
# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
methods = input[0].split(",").map do |entry|
kind, value = entry.split(":")
case kind
when "card" then Card.new
when "paypal" then PayPal.new
when "gift" then GiftCard.new(value.to_f)
else Voucher.new(value.to_f)
end
end
input.drop(1).each { |line| puts checkout(line.to_f, methods) }
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ớpBiến instancePhương thức và selfto_s và inspectÔn tập: thẻ thư viện4Tính đóng gói
Phương thức riêng tưPhương thức được bảo vệPhương thức thiết lập riêng tưBảo vệ trạng tháiÔn tập: máy bán hàng tự động7Tính đa hình và duck typing
Tính đa hìnhDuck typingPhương thức trừu tượngcase và lớpÔn tập: phương thức thanh toán2Phương thức truy cập và self
Phương thức đọc và ghiPhương thức gán tùy chỉnhself trong phương thứcĐịnh danh và tính bằng nhauÔn tập: Danh sách liên hệTự luyện tập: Trình biên dịch Ruby online