الفئات الفرعية
جزء من قسم البرمجة كائنية التوجه في رحلة 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'التحدي
سهلأكمل الأصناف. يخزّن 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 عبر الإنترنت