الفئات الفرعية
جزء من قسم البرمجة كائنية التوجه في رحلة 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'التحدي
سهلأكمل الأصناف. يخزّن 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
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت