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

تعبّر الوراثة عن علاقة «هو نوع من»: فالكلب حيوان، وحساب التوفير حساب. يوضع السلوك المشترك في الصنف الفائق مرة واحدة، ويضيف كل صنف فرعي ما يميّزه. في هذا القسم، يوجد كل صنف في ملف مستقل، ويُحمَّل ملف الصنف الفائق أولًا:

# 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 بأربع عجلات أو Bike بعجلتين، ثم يطبع 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 عبر الإنترنت