هناك نوعان من التطبيقات المختلفة للبرمجة الموجهة للكائنات في بيرل:
يعتمد أحدهما على طريقة جدول التجزئة المجهول. جوهر كل مثيل كائن هو مرجع يشير إلى جدول التجزئة المجهول. في جدول التجزئة المجهول هذا، يتم تخزين كافة سمات المثيل.
والثاني هو الأسلوب القائم على المصفوفة. عند تحديد فئة، سنقوم بإنشاء مصفوفة لكل سمة مثيل، وجوهر كل مثيل كائن هو مرجع يشير إلى فهرس الصف في هذه المصفوفات. في هذه المصفوفات، يتم تخزين كافة خصائص المثيل.
هناك العديد من المفاهيم الأساسية في الكائنات الموجهة، وهنا نقبل ثلاثة: الكائنات والفئات والأساليب.
الكائن : الكائن هو مرجع إلى عنصر بيانات في الفصل الدراسي. .
الفئة : الفئة عبارة عن حزمة Perl تحتوي على فئات توفر أساليب الكائن.
الطريقة : الطريقة هي روتين فرعي لـ Perl، واسم الفئة هو المعلمة الأولى لها.
توفر لغة Perl الدالة Bless (). تُستخدم Bless لإنشاء كائنات. تقوم Bless بربط مرجع باسم الفئة وإنشاء كائن عن طريق إرجاع المرجع.
الفصل هو مجرد حزمة بسيطة.
يمكنك استخدام الحزمة كفئة، واستخدام الوظائف الموجودة في الحزمة كطرق للفئة.
توفر حزم Perl مساحات أسماء مستقلة، لذا لن تتعارض أسماء الأساليب والمتغيرات في الحزم المختلفة.
امتداد الملف لفئات Perl هو .pm.
بعد ذلك نقوم بإنشاء فئة الشخص:
شخص الحزمة؛
يصل نطاق التعليمات البرمجية للفئة إلى السطر الأخير من ملف البرنامج النصي، أو قبل الكلمة الأساسية التالية للحزمة.
لإنشاء مثيل (كائن) لفئة نحتاج إلى تعريف مُنشئ تستخدم معظم البرامج اسم الفئة كمنشئ، ولكن في Perl يمكنك استخدام أي اسم.
يمكنك استخدام متغيرات Perl المختلفة ككائنات Perl. في معظم الأحيان سوف نستخدم المصفوفات المرجعية أو التجزئة.
بعد ذلك، نقوم بإنشاء مُنشئ لفئة الشخص، باستخدام مرجع التجزئة الخاص بـ Perl.
عند إنشاء كائن، تحتاج إلى توفير مُنشئ، وهو روتين فرعي يُرجع مرجعًا إلى الكائن.
الأمثلة هي كما يلي:
بعد ذلك نقوم بإنشاء كائن:
$object = new Person( "Xiao Ming", "王", 23234345);
طريقة فئة Perl هي مجرد روتين فرعي لـ Perl، والذي يُعرف عادةً باسم وظيفة العضو.
لا يوفر تعريف طريقة Perl في لغة Perl الموجهة للكائنات أي بناء جملة خاص، ولكنه ينص على أن المعلمة الأولى للطريقة هي الكائن أو الحزمة المرجعية الخاصة به.
لا توفر لغة Perl متغيرات خاصة، ولكن يمكننا إدارة بيانات الكائن من خلال طرق مساعدة.
بعد ذلك نحدد طريقة للحصول على الاسم:
sub getFirstName { return $self->{_firstName};}
يمكنك أيضًا الكتابة بهذه الطريقة:
sub setFirstName { my ( $self, $firstName ) = @_ $self->{_firstName} = $firstName إذا تم تعريفه($firstName);}
بعد ذلك نقوم بتعديل كود ملف Person.pm كما يلي:
رمز البرنامج النصي للموظفين.pl هو كما يلي:
بعد تنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
$ perl member.pl الاسم: Xiao Ming اللقب: Wang Number: 23234345 الاسم قبل الإعداد هو: Xiao Ming الاسم بعد الإعداد: Xiao Qiang
يتم توريث أساليب الفئة في Perl من خلال مصفوفة @ISA. تحتوي هذه المصفوفة على أسماء الحزم (الفئات) الأخرى. يجب تعيين وراثة المتغيرات بشكل صريح.
الوراثة المتعددة تعني أن مصفوفة @ISA تحتوي على أسماء فئات (حزم) متعددة.
يمكن توريث الأساليب فقط من خلال @ISA، وليس البيانات.
بعد ذلك نقوم بإنشاء فئة الموظف التي ترث فئة الشخص.
يبدو رمز ملف الموظف.pm كما يلي:
الآن تحتوي فئة الموظف على جميع أساليب وخصائص فئة الشخص، ونقوم بإدخال الكود التالي في ملف main.pl وتنفيذه:
بعد تنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
$ perl main.pl الاسم: Xiao Ming اللقب: Wang Number: 23234345 الاسم قبل الإعداد هو: Xiao Ming الاسم بعد الإعداد: Xiao Qiang
في المثال أعلاه، ترث فئة الموظف فئة الشخص، ولكن إذا لم تتمكن أساليب فئة الشخص من تلبية الاحتياجات، فيجب إعادة كتابة أساليبها.
بعد ذلك نضيف بعض الأساليب الجديدة إلى فئة الموظف ونتجاوز أساليب فئة الشخص:
نقوم بإدخال الكود التالي في ملف main.pl ونقوم بتنفيذه:
بعد تنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
$ perl main.pl الاسم: Xiao Ming الاسم الأخير: Wang Number: 23234345 هذا هو اسم وظيفة الفئة الفرعية قبل الإعداد: Xiao Ming هذا هو اسم وظيفة الفئة الفرعية بعد الإعداد: Xiaoqiang
إذا لم يتم العثور على الطريقة المطلوبة في الفئة الحالية، وجميع الفئات الأساسية للفئة الحالية والفئة UNIVERSAL، فسيتم البحث عن طريقة تسمى AUTOLOAD() مرة أخرى. إذا تم العثور على AUTOLOAD، فسيتم استدعاؤه ويتم تعيين المتغير العام $AUTOLOAD على الاسم المؤهل بالكامل للطريقة المفقودة.
إذا لم ينجح ذلك، فإن لغة Perl تفشل مع ظهور خطأ.
إذا كنت لا تريد أن ترث التحميل التلقائي للفئة الأساسية، فالأمر بسيط جدًا، فقط جملة واحدة:
التحميل التلقائي الفرعي؛
يتم إتلاف الكائن تلقائيًا عند تحرير المرجع الأخير للكائن.
إذا كنت تريد القيام بشيء ما أثناء التدمير، فيمكنك تحديد طريقة تسمى "DESTROY" في الفصل الدراسي. سيتم استدعاؤه تلقائيًا في الوقت المناسب وتنفيذ إجراءات تنظيف إضافية كما يحلو لك.
package MyClass;...sub DESTROY{ طباعة "MyClass::DESTROY يسمىn";}
سيقوم Perl بتمرير مرجع الكائن باعتباره المعلمة الوحيدة لـ DESTROY. لاحظ أن هذا المرجع للقراءة فقط، مما يعني أنه لا يمكنك تعديله عن طريق الوصول إلى $_[0]. (ملاحظة المترجم: راجع perlsub) ولكن الكائن نفسه (مثل "${$_[0]" أو "@{$_[0]}" و"%{$_[0]}"، وما إلى ذلك) يمكنه لا يزال مكتوبا.
إذا قمت بإعادة ترسيخ مرجع كائن قبل عودة المدمر، فسيقوم Perl باستدعاء أسلوب DESTROY للكائن الذي قمت بإعادة ترسيخه بعد عودة المدمر. يمنحك هذا الفرصة لاستدعاء أداة تدمير الفئة الأساسية أو الفئات الأخرى التي تحددها. تجدر الإشارة إلى أنه يمكن أيضًا استدعاء DESTROY يدويًا، ولكن ليس من الضروري عادةً القيام بذلك.
بعد تحرير الكائن الحالي، سيتم تحرير الكائنات الأخرى الموجودة في الكائن الحالي تلقائيًا.
يمكننا أن نفهم بشكل أكبر تطبيق Perl الموجه للكائنات من خلال الأمثلة التالية:
بتنفيذ البرنامج أعلاه تكون نتيجة الإخراج هي:
استدعاء أسلوب MyClass::new ودعاMyClass::MyMethod استدعاء أسلوب MySubClass MySubClass::new دعاMyClass::MyMethod تم استدعاؤه! يسمى إنشاء كائن MyClass::new يسمىMyClass::DESTROY ينتهي تنفيذ البرنامج النصي...MyClass::DESTROY تم استدعاء MySubClass::DESTROY