Menu
CoddyTech

Ô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.

challenge icon

Thử thách

Trung bình

Xâ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

Tự luyện tập: Trình biên dịch Ruby online