Menu
Coddy logo textTech

תתי־מחלקות

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