توريث الكلاس في البرمجة الكائنية Class Inheritance in OOP

Ali Majrashiمنذ 9 سنوات

توريث الكلاس في البرمجة الكائنية Class Inheritance in OOP

عند العمل على الكلاسات في االبرمجة الكائنية فإنك تسطتيع وبكل سهولة إستخدام الخصائص Properties والأفعال Methods لأي كلاس داخل كلاس آخر باستخدام الكلمة extends فائدة Inheritance تبرز بتلخيص الأفعال و الخصائص عن طريق منع تكرار كتابة الأكواد 

فمثلا لو لديك كلاس A وبداخله 20 فعل Methods ولديك كلاس B وبداخله 5 افعال Methods وترغب باستخدام الإثنين على هيئة كلاس واحد بدون اعادة كتابة عمل بعض الأكواد داخل الكلاسات تستطيع تحقيق ذلك عن طريق جعل الكلاس B يقوم بعمل extends للكلاس A ومن هنا انت تقوم بتوريث Inherite كل الخصائص والأفعال الموجودة داخل الكلاس A للكلاس B فعندما تقوم بإنشاء كائن جديد بإستخدام الكلاس B أنت الآن لديك القدرة بإستخدام جميع الأفعال والخصائص التي تم تعريفها داخل الكلاس A

للتعرف على البرمجة الكائنية ننصحك بقراءة 

https://3alam.pro/articles/php/object-oriented-programming-php/https://3alam.pro/articles/php/magic-methods-in-oop/

ولتبسيط الأمثلة سوف نستخدم نفس اسلوب الأكواد في المقالات السابقة 

لنفرض ان لديك ملف php وبداخله هذا الكلاس من الأمثلة السابقة سوف نقوم بتعديل خفيف على constructor و destructor بحيث نكتب اسم الكلاس لتسهيل الأمثلة ليصبح محتوى الملف كالتالي


<?php

class SimpleClassclass SimpleClass
{
	public $property = "I'm a class property!";

	public function __construct()
	  {
	      echo 'The class was initiated successfully From SimpleClass. <br/>';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally From SimpleClass. <br/>';
	  }

	public function __toString()
	  {
	      return 'Using the toString method <br/>';
	  }

	public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
	public function getProperty()
	  {
	      return $this->property . "<br/>";
	  }
}

وبعدها نقوم بعمل كلاس جديد يقوم بوراثة Inherite جميع خصائص Properties  و أفعال Methods الكلاس SimpleClass بكل بساطة سوف نستخدم الكلمة extends عند إنشاء الكلاس الجديد ونخبرها بأن ترث Inherite الكلاس SimpleClass

الآن قم بإنشاء كلاس جديد وأجعله يرث Inherite الكلاس SimpleClass باستخدام extends ليصبح الكود كالتالي 


<?php

class SimpleClass
{
	public $property = "I'm a class property!";

	public function __construct()
	  {
	      echo 'The class was initiated successfully From SimpleClass. <br/>';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally From SimpleClass. <br/>';
	  }

	public function __toString()
	  {
	      return 'Using the toString method <br/>';
	  }

	public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
	public function getProperty()
	  {
	      return $this->property . "<br/>";
	  }
}

class MyOtherClass extends SimpleClass
{

	public function newMethod()
	  {
		echo "From newMethod() in MyOtherClass. <br/>";
	  }
}

// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
 
// Output the object as a string
echo $newobject->newMethod();
 
// Use a method from the parent class
echo $newobject->getProperty();

لو قمنا بتشغيل الملف من المتصفح سيكون الناتج كالتالي

1.png

لاحظ بمجرد وراثة الكلاس SimpleClass أصبح من الممكن إستخدام جميع  خصائص و أفعال الكلاس SimpleClass عن طريق الكلاس الجديد MyOtherClass وبكل سهولة ومرونة وأيضا الأفعال السحرية Magic Methods تم تنفيذها عن طريق الكلاس الجديد MyOtherClass

إعادة صياغة الخصائص و الأفعال المورثة Overwriting Inherited Properties and Methods

إذا كنت ترغب بتغيير قيمة أي خاصية Property أو طريقة عمل أي فعل Method داخل الكلاس الجديد كل المطلوب منك هو إعادة كتابتهم وتعريفهم داخل الكلاس الجديد MyOtherClass

بالمثال السابق عند تنفيذ الكود لاحظ أنه الفعل السحري Magic Method


__construct()

تم تنفيذ محتواه من الكلاس القديم SimpleClass الآن بالكلاس الجديد قم بتعريف هذا الفعل وتغيير محتواه لإعادة صياغة عمل الفعل عند تنفيذه من قبل الكلاس الجديد ليصبح محتوى الملف لديك كالتالي


<?php

class SimpleClass
{
	public $property = "I'm a class property!";

	public function __construct()
	  {
	      echo 'The class was initiated successfully From SimpleClass. <br/>';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally From SimpleClass. <br/>';
	  }

	public function __toString()
	  {
	      return 'Using the toString method <br/>';
	  }

	public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
	public function getProperty()
	  {
	      return $this->property . "<br/>";
	  }
}

class MyOtherClass extends SimpleClass
{

	public function __construct()
	  {
	      echo 'A new constructor From MyOtherClass. <br/>';
	  }

	public function newMethod()
	  {
		echo "From newMethod() in MyOtherClass. <br/>";
	  }
}

// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
 
// Output the object as a string
echo $newobject->newMethod();
 
// Use a method from the parent class
echo $newobject->getProperty();

عند تنفيذ الكود بالمتصفح سيكون الناتج كالتالي

2.png

لاحظ أن قيمة الفعل السحري Constructor تغيرت بمجرد إعادة تعريفها بالكلاس الجديد و تغيير محتواها مما يسمح لك أن تقوم بتعديل عمل أي فعل او تغيير قيمة أي خاصية لتناسب رغبتك عند العمل مع الكلاسات classes  والكائنات Objects 

الحفاظ على وظيفة الأفعال الأساسية عند إعادة صياغتها Preserving Original Method Functionality While Overwriting Methods

أحيانا أنت لاترغب بحذف طرق عمل الأفعال السابقة مثلما فعلنا بالمثال السابق ولكن ترغب بإضافة المزيد من الوظائف و الأكواد لتنفيذها مع الحفاظ على طرق عمل وظائف الفعل الأساسية

نستطيع الحفاظ على وظائف الأفعال الأساسية عند إعادة صياغتها باستخدام الكلمة parent بعدها :: متبوعة بإسم الفعل Method Name

يطلق على :: مسمى scope resolution operator


parent::MethodName; // Call the parent class's Method

الآن قم بتغيير المثال السابق واستخدام parent للحفاظ على قيمة constructor الأساسية ليصبح محتوى الكود كالتالي 


<?php

class SimpleClass
{
	public $property = "I'm a class property!";

	public function __construct()
	  {
	      echo 'The class was initiated successfully From SimpleClass. <br/>';
	  }

	public function __destruct()
	  {
	      echo 'The class was destroyed finally From SimpleClass. <br/>';
	  }

	public function __toString()
	  {
	      return 'Using the toString method <br/>';
	  }

	public function setProperty($newValue)
	  {
	      $this->property = $newValue;
	  }
 
	public function getProperty()
	  {
	      return $this->property . "<br/>";
	  }
}

class MyOtherClass extends SimpleClass
{

	public function __construct()
	  {
	      parent::__construct(); // Call the parent class constructor
	      echo 'A new constructor From MyOtherClass. <br/>';
	  }

	public function newMethod()
	  {
		echo "From newMethod() in MyOtherClass. <br/>";
	  }
}

// Create a new object From MyOtherClass
$newobject = new MyOtherClass;
 
// Output the object as a string
echo $newobject->newMethod();
 
// Use a method from the parent class
echo $newobject->getProperty();

عند تنفيذ الكود بالمتصفح فإن الناتج سيكون كالتالي 

3.png

لاحظ أنه تم تنفيذ محتوى constructor من الكلاس SimpleClass أولا ثم تنفيذ محتوى constructor من الكلاس MyOtherClass مما يسمح لك بمرونة التغيير على اي فعل او خاصية بمنتهى السهولة أو إضافة أوامر يتم تنفيذ محتواها بجانب الأكواد الأساسية

الخلاصة

فائدة Inheritance تكمن بتوفير المرونة عند التعامل مع الكلاسات ومنع إعادة كتابة الأكواد بالمشاريع البرمجية لتسهل الصيانة والتطوير بالمستقبل

فإذا كنت تعمل بمشروع كبير وفيه العديد من الكلاسات المهمة لديك مثلا لديك كلاس للتعامل مع قواعد البيانات يقوم بالإتصال بقاعدة البيانات ويقوم بتخزين البيانات فيها واستعراض البيانات المخزنة و البقية من عمليات قواعد البيانات المهمة ثم ترغب باستخدام هذا الكلاس داخل احد صفحات المشروع ولكن تجد نفسك تحتاج المزيد من الوظائف الخاصة بهذه الصفحة مثل عرض عنوان الصفحة المخزن بقاعدة البيانات ولكن بتعديلات مميزة عليه او عرض بيانات مخزنة بقاعدة البيانات بعد معالجتها باسلوب عرض مميز خاص بهذه الصفحة فقط بدل الرجوع الى الكلاس الأساسي وإضافة هذه الوظائف أي الأفعال Methods إلى الكلاس تستطيع عمل كلاس جديد خاص بهذه الصفحة يقوم بوراثة جميع خصائص و أفعال الكلاس الأساسي وإضافة الأفعال التي تناسب هذه الصفحة ثم إستخدام هذا الكلاس داخل هذه الصفحة هذا مثال مبسط ويوجد استخدامات عديدة لهذا الأسلوب في البرمجة 

هذا الأسلوب سيوفر عليك جهد التعديل على الكلاس الأساسي لو نفرض ان لديك 20 صفحة وأغلبها يتطلب وظائف مميزة وخاصه بهم بهذا الأسلوب انت قمت بتسهيل التعامل مع الكلاسات وتطويرهم على حسب احتياج كل صفحة لديك وايضا قمت بتسهيل البحث عن الأخطاء والتطوير المستقبلي بدون التاثير على عمل الكلاس الأساسي لتجنب أخطاء فادحة ممكن ان توقف عمل المشروع كامل 

 

كلمات دليلية:
1
إعجاب
15704
مشاهدات
0
مشاركة
1
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !