Ôn tập: Bảng lương nhân viê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 26 trên 57.
Thử thách
Trung bìnhXây dựng hệ thống tính lương bằng kế thừa. Employee.new(name, rate) có pay(hours) (lấy mức lương nhân với số giờ, trong đó số giờ vượt quá 40 được trả gấp 1.5 lần mức lương) và line(hours) trả về Ada (employee): 800.00, được tạo từ pay(hours) và role, trong đó role trả về employee. Manager.new(name, rate, bonus) truyền name và rate cho super, cộng tiền thưởng vào tiền lương từ super và có vai trò manager. Contractor < Employee được trả lương bằng mức lương nhân với số giờ, không có tiền làm thêm giờ, và có vai trò contractor.
Code được cung cấp đọc các dòng employee Ada 20 40, manager Bo 30 45 500 hoặc contractor Cy 50 50 (tên, mức lương, số giờ và tiền thưởng cho quản lý), rồi in ra line(hours) cho từng người, sau đó in staff: 3, managers: 1, employees: 3 (cả hai đều được đếm bằng is_a?, vì vậy quản lý và nhà thầu cũng là nhân viên) và tổng tiền lương.
Code của bạn nằm trong employee.rb, manager.rb và contractor.rb. main.rb 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ử
require_relative 'employee'
require_relative 'manager'
require_relative 'contractor'
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
input = []
while (line = gets)
input << line.chomp
end
staff = input.map do |line|
kind, name, rate, hours, bonus = line.split
worker = case kind
when "manager" then Manager.new(name, rate.to_f, bonus.to_f)
when "contractor" then Contractor.new(name, rate.to_f)
else Employee.new(name, rate.to_f)
end
[worker, hours.to_i]
end
staff.each { |worker, hours| puts worker.line(hours) }
managers = staff.count { |w, _| w.is_a?(Manager) }
employees = staff.count { |w, _| w.is_a?(Employee) }
puts "staff: #{staff.size}, managers: #{managers}, employees: #{employees}"
puts format("total: %.2f", staff.sum { |w, h| w.pay(h) })
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