Menu
CoddyTech

תתי־מחלקות

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

superclass מציין את מחלקת האב של מחלקה. למחלקת 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'
challenge icon

אתגר

קל

השלימו את המחלקות. 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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Ruby אונליין