Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الفئات الفرعية

جزء من قسم البرمجة كائنية التوجه في رحلة 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 &lt; 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 عبر الإنترنت