التشكل/تعدد الاشكال Polymorphism هي احد الخصائص التي توفرها لغة جافا في البرمجة الكائنية. التشكل هو قدرة الصنف او الدوال بوجودها باكثر من شكل وله عدة طرق لتمثليها كالاتي:
is-A
is-A وتعني “يكون/تكون” هي علاقة تكون بين الكائنات من النوع الابن و النوع الاب، وتعني ان اي ابن (child) “يكون” من نوع الاب.
وينتج عن العلاقة is-A احد اشهر صور التشكل Polymorphism هي قدرة المتغير او المرجع من نوع الاب/الوالد parent بان يشير الى الكائن من نوع الابن.
class Parent{ } class Child extends Parent { } class Main{ public static void main(String[] args){ Parent ref = new Child(); System.out.println("Works Fine...."); } }
في الجافا الكائنية عندما نقوم بجملة مثل ()Parent ref = new Child، نقوم بتعريف متغير/مرجع من نوع Parent و كائن من نوع Child. ثم يشير المرجع الى الكائن، وهنا لابد ان يشير المرجع الى الكائنات من نوعه.
يستطيع المتغير/المرجع من نوع الاب ان يشير الى الكائنات من نوع الابن او من نوع الابن، لان الابن يكون (is-A) اب/والد.
التجاوز Overriding
يعتبر التجاوز احد صور التشكل Polymorphism وهو يحدث عندما نسمي اسماء الدوال / الطرق methods في الصنف الابن Child Class بنفس الاسماء في الصنف الوالد Parent Class. وبالتالي طرق الكائن من نوع ابن تغطي طرق الكائن من نوع الاب التي تحمل نفس اسمها.
تشغيلclass Parent{ void printHello(){ System.out.println("Hello From Parent ..."); } } class Child extends Parent { // overriding - التجاوز void printHello(){ System.out.println("Hello From Child ..."); } } class Main{ public static void main(String[] args){ Parent refToParent = new Parent(); refToParent.printHello(); // Hello From Parent ... Parent refToChild = new Child(); refToChild.printHello(); // Hello From Child ... Child child = new Child(); child.printHello(); // Hello From Child ... } }
ملحوظة: لا يوجد تجاوز (override) مع الصفات في الجافا، طالما نستطيع الوصول لتلك الصفات من الصنف الابن، لا تسمح لنا الجافا ان نعرف صفات بنفس الاسم.
للتجاوز قواعد اهمها
- ان يكون اسم الدالة/الطريقة في الصنف الابن و الوالد متماثلين.
- ان يكون معاملات الطريقة في الصنف الابن والوالد متماثلين.
- ان يكون نوع الراجع return type في االطريقة من صنف الابن متماثل او احد ابناء (child class) لنوع الراجع في طريقة صنف الاب
- ان تكون الطريقة في نوع الاب ليست مسبوقة بالكلمة الخاصة final، حيث انه لا يجوز تجاوز الطريقة المسبوقة ب final.
التحميل Overloading
يعتبر التحميل Overloading احد صور التشكل، وهو عندما نسمي اسم طريقتين او اكثر بنفس الاسم لكن تكون عواملهم parameters مختلفة.
تشغيلclass SumOperations { int sum(int x, int y){ int result = x + y; return result; } // احد صور التحميل بتغير عدد المعاملات int sum(int x, int y, int z){ int result = x + y + z; return result; } // احد صور التحميل بتغير نوع المعاملات double sum(double x, double y){ double result = x + y; return result; } } class Main{ public static void main(String[] args){ SumOperations oper = new SumOperations(); System.out.println(oper.sum(1, 1));//2 System.out.println(oper.sum(1, 1, 1));//3 System.out.println(oper.sum(1.2,1.3));//2.5 } }