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