الصنف Class
في روبي
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف Class
.
عادةً، يمكن عادةً إنشاء صنف جديد بالشكل التالي:
class Name
# تكتب هنا الشيفرة التي تعرف سلوك الصنف
end
عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع Class
ويسند إلى ثابت عام (global constant، هو Name
في المثال السابق).
عند استدعاء Name.new
لإنشاء كائن جديد، يُنفَّذ التابع new
الخاص بالصنف Class
بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع new
:
class Class
alias old_new new
def new(*args)
print "Creating a new ", self.name, "\n"
old_new(*args)
end
end
class Name
end
n = Name.new
ناتج تنفيذ الشيفرة السابقة هو:
Creating a new Name
تكون الأصناف والوحدات (modules) والكائنات مترابطةً مع بعضها بعضًا. في الرسم التوضيحي التالي، تمثل الأسهم الرأسية الوراثة (inheritance)، أما الأقواس فتمثل الأصناف metaclass
. وجميع الأصناف metaclass
هي نُسخ (instances) من الصنف Class
.
+---------+ +-...
| | |
BasicObject-----|-->(BasicObject)-------|-...
^ | ^ |
| | | |
Object---------|----->(Object)---------|-...
^ | ^ |
| | | |
+-------+ | +--------+ |
| | | | | |
| Module-|---------|--->(Module)-|-...
| ^ | | ^ |
| | | | | |
| Class-|---------|---->(Class)-|-...
| ^ | | ^ |
| +---+ | +----+
| |
obj--->OtherClass---------->(OtherClass)-----------...
توابع الصنف العامة (Public Class Methods)
new
يُنشئ التابع new
صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب (superclass) الممرر إليه (أو من الصنف Object
إن لم يمرر إليه أي شيء).
توابع الكائن الخاصة (Public Instance Methods)
allocate
يحجز التابع allocate
مساحةً من الذاكرة لكائن جديد من الصنف class
دون استدعاء التابع initialize
مع النسخة (instance) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف class
.
inherited
يُستدعَى التابع inherited
كرد نداء في كل مرة يُنشأ فيها صنف فرعي (subclass) من الصنف الحالي.
new
يستدعي التابع new
التابعَ allocate
لإنشاء كائن جديد من الصنف class
، ثم يستدعي التابع initialize
مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة.
superclass
يعيد التابع superclass
الصنف الأب (superclass) للصنف المستدعى معه.