Menu
Coddy logo textTech

דריסת מתודות

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין