مفهوم الـ Polymorphism

Polymorphism  تعني تعدد الأشكال.
المقصود من البوليمورفيزم هو بناء دالة تنفذ أوامر مختلفة على حسب الكائن الذي يمرر لها كـ argument.
بوليمورفيزم تعني قدرة الكائن على أخذ عدة أشكال, تحديداً قدرة الكائن على التحول إلى نوع مشتق منه.

تحقيق البوليمورفيزم

البوليمورفيزم هو مجرد أسلوب في كتابة الكود و يمكنك تحقيقه بعدة أشكال مختلفة تجعلك تصل لفكرة تعدد الكائنات.
عملية البوليمورفيزم تبنى في العادة بداخل الدوال, حيث أننا نقوم ببناء دالة تأخذ باراميتر عبارة عن كلاس أو إنترفيس.
عند إستدعاء هذه الدالة, الكائن الذي نمرره لها كـ argument مكان هذا الباراميتر هو الذي يحدد طريقة عملها.

إذاً في البوليمورفيزم نستخدم مبدأ الـ Upcasting حيث أن الكائن الذي سيتم تمريره إلى الدالة يجب أن يحتوي على الدوال و الخصائص المشتركة بين الـ Superclass و الـ Subclass.
و عند إستدعاء أي دالة من الكائن الذي تم تمريره, ستكون هذه الدالة موجودة في الـ Superclass و الـ Subclass و لكنها ستتنفذ على أساس الـ Subclass.

ستفهم المقصود من الأمثلة.

مثال :

في المثال التالي قمنا بإنشاء كلاس إسمه A و نوعه abstract, و يحتوي على دالة إسمها ()print و نوعها abstract أيضاً.
بعدها قمنا بإنشاء إثنين كلاس B و C يرثان من A. بعدها قمنا بإنشاء كلاس آخر إسمه Main و الذي سنطبق فيه مبدأ الـ Polymorphic Array.
بداخل الكلاس Main قمنا بإنشاء كائن من الكلاس B و كائن من الكلاس C, ثم قمنا بتعريف مصفوفة إسمها list و نوعها a, و وضعنا فيها الكائنات التي ترث من الكلاس A.

//الكلاس A نوعه Abstract , إذاً لا يمكن إنشاء كائنات منه  } public abstract class A
;()public abstract void print
// أي كلاس سيرث من الكلاس A يجب أن يفعل Override لهذه الدالة لأن نوعها abstract
{

} public class B extends A
@Override
} ()public void print
// إذا قمت باستدعاء هذه الدالة من هذا الكلاس ستعرض هذه الجملة ;(“System.out.println(“class B
{
{

} public class C extends A
@Override
} ()public void print
// إذا قمت باستدعاء هذه الدالة من هذا الكلاس ستعرض هذه الجملة ;(“System.out.println(“class C
{
{

} public class Main

} (public static void main(String[] args
;()A b = new B
//هنا قمنا بإنشاء كائن من الكلاس A  ثم قمنا بتحديد نوعه ككائن من B
;()A c = new C
//هنا قمنا بإنشاء كائن من الكلاس A  ثم قمنا بتحديد نوعه ككائن من C

;[A[] list = new A[2
//  هنا قمنا بإنشاء مصفوفة نوعها A تتألف من عنصرين فقط

;list[0] = b
هنا قمنا بتخزين الكائن b في أول عنصر في المصفوفة [list[0
;list[1] = c
هنا قمنا بتخزين الكائن c في ثاني عنصر في المصفوفة [list[1

// هنا قمنا ببناء حلقة للمرور على جميع عناصر المصفوفة } (++for(int i=0; i<list.length; i
// هنا سيتم إستدعاء الدالة ()print الخاصة بكل عنصر ;()list[i].print
} // إذاً هنا سيختلف أداء الدالة ()print على إختلاف كل كائن موجود في المصفوفة
{
{

سنحصل على النتيجة التالية عند التشغيل:

class B
class C