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