תתי־מחלקות
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 22 מתוך 57.
ירושה יוצרת מחלקה חדשה על בסיס מחלקה קיימת. class Dog < Animal הופכת את Dog לתת־מחלקה של Animal, מחלקת־העל שלה. לכלב יש את כל המתודות של חיה, כולל initialize, וכן את המתודות ש־Dog מוסיפה:
class Animal
attr_reader :name
def initialize(name)
@name = name
end
def eat
"#{name} is eating"
end
end
class Dog < Animal
def fetch
"#{name} fetches the ball"
end
end
rex = Dog.new("Rex")
puts rex.eat
puts rex.fetchפלט:
Rex is eating
Rex fetches the ballהמתודות שנוספו שייכות למחלקת המשנה בלבד. ל־Animal רגילה אין אותן, ומחלקה אחות כגון Cat אינה רואה את המתודות של Dog:
class Animal
def breathe
"breathing"
end
end
class Dog < Animal
def fetch
"fetching"
end
end
class Cat < Animal
end
puts Cat.new.breathe
begin
Cat.new.fetch
rescue NoMethodError => e
puts e.message
endפלט:
breathing
undefined method `fetch' for an instance of Catsuperclass מציין את מחלקת האב של מחלקה. למחלקת Ruby יש מחלקת־על אחת בדיוק, ומחלקה שמוצהרת ללא < יורשת מ־Object, שמעניקה לכל אובייקט מתודות כגון to_s ו־inspect:
class Animal
end
class Dog < Animal
end
puts Dog.superclass
puts Animal.superclass
puts Object.superclassפלט:
Animal
Object
BasicObjectהורשה מתאימה ליחס is-a: כלב הוא בעל חיים, חשבון חיסכון הוא חשבון. ההתנהגות המשותפת נמצאת פעם אחת במחלקת-העל, וכל מחלקת משנה מוסיפה את מה שמייחד אותה. ביחידה הזו כל מחלקה נמצאת בקובץ משלה, והקובץ של מחלקת-העל נטען ראשון:
# main.rb
require_relative 'animal' # מחלקת־העל תחילה
require_relative 'dog' # class Dog < Animal זקוקה ל־Animal
require_relative 'cat'אתגר
קלהשלם את המחלקות. Vehicle מאחסנת name ומספר wheels, ויש לה את describe, שמחזירה Mini has 4 wheels. Car ו-Bike הן תת-מחלקות של Vehicle שאינן מגדירות את initialize. Car מוסיפה את honk, שמחזירה Mini says beep, ו-Bike מוסיפה את ring, שמחזירה BMX rings.
הקוד שסופק קורא שורות car Mini או bike BMX, יוצר Car עם 4 גלגלים או Bike עם 2, ומדפיס את describe, את הצליל (honk או ring) ואת מחלקת-העל של המחלקה של האובייקט.
הקוד שלך ייכתב בקובצי vehicle.rb, car.rb ו-bike.rb. הקובץ main.rb מכיל את קוד הקלט/פלט שסופק, ואי אפשר לערוך אותו.
נסו בעצמכם
require_relative 'vehicle'
require_relative 'car'
require_relative 'bike'
# קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
input = []
while (line = gets)
input << line.chomp
end
input.each do |line|
kind, name = line.split(" ", 2)
if kind == "car"
v = Car.new(name, 4)
sound = v.honk
else
v = Bike.new(name, 2)
sound = v.ring
end
puts v.describe
puts sound
puts v.class.superclass
end
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין