復習 - スタッフ給与計算
CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 26/57。
チャレンジ
中級継承を使って給与計算を構築してください。Employee.new(name, rate) には pay(hours)(rate と hours の積。ただし 40 を超える hours には rate の 1.5 倍を支払う)と、pay(hours) および role から構成された Ada (employee): 800.00 を返す line(hours) があります。role は employee を返します。Manager.new(name, rate, bonus) は name と rate を super に渡し、super の pay に bonus を加え、role は manager です。Contractor < Employee は時間外労働なしで rate と hours の積が支払われ、role は contractor です。
提供されたコードは、employee Ada 20 40、manager Bo 30 45 500、または contractor Cy 50 50(name、rate、hours、および manager の場合は bonus)の行を読み取り、それぞれについて line(hours) を出力します。その後、staff: 3, managers: 1, employees: 3(いずれも is_a? で数えるため、manager と contractor も employee です)と合計給与を出力します。
コードは employee.rb、manager.rb、contractor.rb に記述します。main.rb には提供された入出力コードが含まれており、編集できません。
自分で試してみよう
require_relative 'employee'
require_relative 'manager'
require_relative 'contractor'
# 提供された入出力コード: そのままにしておく
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) })
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ