דריסת מתודות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-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]אתגר
קלהשלימו את מחלקות השכר. 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}"
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין