Menu
CoddyTech

דריסת מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 23 מתוך 57.

תת־מחלקה יכולה לדרוס מתודה באמצעות הגדרת מתודה בעלת אותו שם. Ruby מחפשת מתודה תחילה במחלקה של האובייקט עצמו, ורק לאחר מכן במחלקת־העל, ולכן הגרסה של תת־המחלקה היא זו שמנצחת:

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Fish < Animal
end

puts Dog.new.speak
puts Fish.new.speak

פלט:

Woof
...

מתודה במחלקת־על שקוראת למתודה אחרת משתמשת בגרסה שעברה דריסה עבור אובייקטים של מחלקת־משנה. המתודה המשותפת נכתבת פעם אחת, וכל מחלקת־משנה משנה רק את החלק ששונה:

class Animal
  def initialize(name)
    @name = name
  end

  def introduce
    "#{@name} says #{speak}"
  end

  def speak
    "..."
  end
end

class Cat < Animal
  def speak
    "Meow"
  end
end

puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduce

פלט:

Tom says Meow
Thing says ...

דריסת to_s במחלקת משנה משנה את אופן ההדפסה של מחלקת המשנה בלבד. מתודות שהיא אינה דורסת עדיין מגיעות ממחלקת-העל:

class Item
  def initialize(name, price)
    @name = name
    @price = price
  end

  def to_s
    format("%s %.2f", @name, @price)
  end
end

class SaleItem < Item
  def to_s
    format("%s %.2f (sale)", @name, @price * 0.8)
  end
end

puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)

פלט:

Lamp 20.00
Lamp 16.00 (sale)

סדר החיפוש של Ruby הוא רשימת האבות הקדמונים של המחלקה: המחלקה עצמה, אחר כך מחלקת האב שלה, וכן הלאה עד Object. המחלקה הראשונה ברשימה שמגדירה את המתודה מספקת אותה:

class Animal
  def speak
    "..."
  end
end

class Dog < Animal
  def speak
    "Woof"
  end
end

class Puppy < Dog
end

puts Puppy.new.speak
p Puppy.ancestors.take(3)

פלט:

Woof
[Puppy, Dog, Animal]
challenge icon

אתגר

קל

השלימו את מחלקות השכר. Employee מאחסנת name ויש לה את pay(hours), שמחזירה hours * 20, ואת payslip(hours), שמחזירה Ada: 800 באמצעות pay. Manager דורסת את pay ומחזירה 1500 קבועים, ללא קשר למספר השעות. Intern דורסת את pay ומחזירה hours * 12, אך לכל היותר 300. payslip מוגדרת רק ב-Employee.

הקוד שסופק קורא שורות employee Ada 40, manager Bo 50 או intern Cy 20, יוצר את האובייקט המתאים ומדפיס את תלוש השכר שלו, ואז מדפיס את סך התשלומים.

יש לכתוב את הקוד שלכם בקבצים employee.rb, manager.rb ו-intern.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

require_relative 'employee'
require_relative 'manager'
require_relative 'intern'

# קוד קלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
  input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
  kind, name, hours = line.split
  worker = kinds[kind].new(name)
  puts worker.payslip(hours.to_i)
  total += worker.pay(hours.to_i)
end
puts "total: #{total}"
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Ruby אונליין