تجاوز الدوال
جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 23 من 57.
يمكن للصنف الفرعي إعادة تعريف طريقة من خلال تعريف طريقة تحمل الاسم نفسه. يبحث Ruby عن الطريقة في صنف الكائن نفسه أولًا، ثم في الصنف الفائق فقط، ولذلك تكون نسخة الصنف الفرعي هي المعتمدة:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Fish < Animal
end
puts Dog.new.speak
puts Fish.new.speakالناتج:
Woof
...تستخدم طريقة في الفئة الفائقة تستدعي طريقة أخرى الإصدار المُعاد تعريفه لكائنات الفئات الفرعية. تُكتب الطريقة المشتركة مرة واحدة، ولا تغيّر كل فئة فرعية سوى الجزء المختلف:
class Animal
def initialize(name)
@name = name
end
def introduce
"#{@name} says #{speak}"
end
def speak
"..."
end
end
class Cat < Animal
def speak
"Meow"
end
end
puts Cat.new("Tom").introduce
puts Animal.new("Thing").introduceالناتج:
Tom says Meow
Thing says ...يؤدي تجاوز to_s في فئة فرعية إلى تغيير كيفية طباعة تلك الفئة الفرعية فقط. أما الأساليب التي لا تتجاوزها، فتبقى موروثة من الفئة الفائقة:
class Item
def initialize(name, price)
@name = name
@price = price
end
def to_s
format("%s %.2f", @name, @price)
end
end
class SaleItem < Item
def to_s
format("%s %.2f (sale)", @name, @price * 0.8)
end
end
puts Item.new("Lamp", 20)
puts SaleItem.new("Lamp", 20)الناتج:
Lamp 20.00
Lamp 16.00 (sale)ترتيب بحث Ruby هو الأسلاف (ancestors) للصنف: الصنف نفسه، ثم صنفه الفائق، وهكذا وصولًا إلى Object. أول صنف في تلك القائمة يعرّف الطريقة يوفّرها:
class Animal
def speak
"..."
end
end
class Dog < Animal
def speak
"Woof"
end
end
class Puppy < Dog
end
puts Puppy.new.speak
p Puppy.ancestors.take(3)الناتج:
Woof
[Puppy, Dog, Animal]التحدي
سهلأكمل أصناف كشوف الرواتب. يخزّن Employee قيمة name، ويحتوي على pay(hours) التي تُرجع hours * 20، وعلى payslip(hours) التي تُرجع Ada: 800 باستخدام pay. يعيد Manager تعريف pay بقيمة ثابتة مقدارها 1500 بغضّ النظر عن عدد الساعات. يعيد Intern تعريف pay باستخدام hours * 12، ولكن بحد أقصى 300. لا يتم تعريف payslip إلا في Employee.
يقرأ الكود المزوَّد الأسطر employee Ada 40 أو manager Bo 50 أو intern Cy 20، وينشئ الكائن المطابق ويطبع كشف راتبه، ثم يطبع إجمالي الأجر.
يجب أن تضع كودك في employee.rb وmanager.rb وintern.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.
جرّب بنفسك
require_relative 'employee'
require_relative 'manager'
require_relative 'intern'
# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
input << line.chomp
end
kinds = { "employee" => Employee, "manager" => Manager, "intern" => Intern }
total = 0
input.each do |line|
kind, name, hours = line.split
worker = kinds[kind].new(name)
puts worker.payslip(hours.to_i)
total += worker.pay(hours.to_i)
end
puts "total: #{total}"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت