تعدد الأشكال في Java (ثابتة وديناميكية)
ما هو تعدد الأشكال في Java?
تعدد الأشكال in Java يحدث عندما يكون هناك فئة أو كائنات واحدة أو أكثر مرتبطة ببعضها البعض عن طريق الميراث. إنها قدرة الكائن على اتخاذ أشكال عديدة. يتيح الوراثة للمستخدمين وراثة السمات والأساليب، ويستخدم تعدد الأشكال هذه الأساليب لأداء مهام مختلفة. لذا، الهدف هو التواصل، لكن النهج مختلف.
على سبيل المثال، لديك هاتف ذكي للتواصل. يمكن أن يكون وضع الاتصال الذي تختاره أي شيء. يمكن أن يكون مكالمة أو رسالة نصية أو رسالة مصورة أو بريدًا إلكترونيًا وما إلى ذلك. لذا، فإن الهدف مشترك وهو التواصل، لكن نهجهم مختلف. وهذا ما يسمى تعدد الأشكال. والآن سوف نتعلم تعدد الأشكال Java مع المثال.
انقر هنا إذا لم يكن من الممكن الوصول إلى الفيديو
Java تعدد الأشكال في OOPs مع مثال
لدينا فئة رئيسية واحدة، وهي "الحساب" مع وظيفة الإيداع والسحب. تحتوي فئة الحساب على فئتين فرعيتين. عملية الإيداع والسحب هي نفسها بالنسبة لحسابات التوفير والحسابات الجارية. لذا فإن الطرق الموروثة من فئة الحساب ستعمل.
التغيير في متطلبات البرامج
هناك تغيير في مواصفات المتطلبات، وهو أمر شائع جدًا في صناعة البرمجيات. من المفترض أن تضيف وظيفة حساب مصرفي خاص مع مرفق السحب على المكشوف. على سبيل المثال، السحب على المكشوف هو مرفق يمكنك من خلاله سحب مبلغ أكبر من الرصيد المتاح في حسابك. لذا، فإن طريقة السحب الخاصة بالمستفيدين تحتاج إلى التنفيذ من جديد. لكنك لا تغير قطعة الكود التي تم اختبارها في حساب التوفير والحساب الجاري. هذه ميزة وجه الفتاة
الخطوة 1) بحيث أنه عندما يتم استدعاء الطريقة "المسحوبة" لحساب التوفير، يتم تنفيذ طريقة من فئة الحساب الأصلي
الخطوة 2) ولكن عندما يتم استدعاء طريقة "السحب" للحساب المميز (تسهيلات السحب على المكشوف) يتم تنفيذ طريقة السحب المحددة في الفئة المميزة. هذا هو تعدد الأشكال في OOPs.
طريقة التجاوز في Java
يؤدي تجاوز الطريقة إلى إعادة تعريف طريقة الفئة الفائقة في فئة فرعية.
قواعد لتجاوز الطريقة
- يجب أن يتطابق توقيع الطريقة، أي اسم الطريقة وقائمة المعلمات ونوع الإرجاع تمامًا.
- يمكن للطريقة المتجاوزة توسيع إمكانية الوصول ولكن ليس تضييقها، على سبيل المثال، إذا كانت خاصة في الفئة الأساسية، يمكن للفئة الفرعية جعلها عامة ولكن ليس العكس.
مثال
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } Class run{ public static void main (String args[]){ Doctor doctorObj = new Doctor() // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
الفرق بين التحميل الزائد والتجاوز
يكون التحميل الزائد للأسلوب في نفس الفئة، حيث يكون هناك أكثر من أسلوب يحمل نفس الاسم ولكن بتوقيعات مختلفة. | يتم تجاوز الطريقة عند إعادة تعريف إحدى الطرق الموجودة في الفئة الفائقة في الفئة الفرعية. وفي هذه الحالة، يبقى توقيع الطريقة كما هو. |
مثلا:
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
مثلا:
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
ما هو تعدد الأشكال الديناميكي؟
تعدد الأشكال الديناميكي في OOPs هو الآلية التي يمكن من خلالها تعريف طرق متعددة بنفس الاسم والتوقيع في الفئة الفائقة والفئة الفرعية. يتم حل الاستدعاء إلى الأسلوب الذي تم تجاوزه في وقت التشغيل.
مثال على تعدد الأشكال الديناميكي:
يمكن أن يشير المتغير المرجعي للفئة الفائقة إلى كائن فئة فرعية
Doctor obj = new Surgeon();
النظر في البيان
obj.treatPatient();
هنا المتغير المرجعي "obj" هو من الفئة الأصلية، ولكن الكائن الذي يشير إليه هو من الفئة الفرعية (كما هو موضح في الرسم البياني أدناه لمثال تعدد الأشكال).
سيقوم obj.treatPatient() بتنفيذ طريقة TreatPatient() للفئة الفرعية - الجراح
إذا تم استخدام مرجع فئة أساسية لاستدعاء طريقة ما، فسيتم تحديد الطريقة التي سيتم استدعاؤها بواسطة JVM، اعتمادًا على الكائن الذي يشير إليه المرجع
على سبيل المثال، على الرغم من أن obj مرجع إلى Doctor، فإنه يستدعي الأسلوب Surgeon، لأنه يشير إلى كائن Surgeon
يتم تحديد ذلك أثناء وقت التشغيل ومن ثم يتم تسميته ديناميكي or تعدد الأشكال وقت التشغيل
الفرق بين تعدد الأشكال الثابت والديناميكي
تعدد الأشكال الساكن في Java هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت الترجمة، في حين أن تعدد الأشكال الديناميكي هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت التشغيل.
يتعلق الأمر بطريقة التحميل الزائد. | يتعلق الأمر بتجاوز الأسلوب. |
يتم حل الأخطاء، إن وجدت، في وقت الترجمة. وبما أنه لا يتم تنفيذ التعليمات البرمجية أثناء التجميع، ومن هنا جاء الاسم ثابت.
مثلا: void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
في حالة قيام متغير مرجعي باستدعاء طريقة متجاوزة، يتم تحديد الطريقة التي سيتم استدعاؤها بواسطة الكائن الذي يشير إليه المتغير المرجعي. لا يمكن تحديد ذلك إلا في وقت التشغيل عندما تكون التعليمات البرمجية قيد التنفيذ، ومن هنا جاء الاسم ديناميكي.
مثلا: //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
الكلمة الرئيسية الفائقة في Java
ماذا لو أرادت طريقة treatPatient في فئة Surgeon تنفيذ الوظيفة المحددة في فئة Doctor ثم تنفيذ وظيفتها الخاصة؟ في هذه الحالة، الكلمة الأساسية super
يمكن استخدامها للوصول إلى طرق الفئة الأصلية من الفئة الفرعية. يمكن كتابة طريقة TreatPatient في فئة Surgeon على النحو التالي:
treatPatient(){ super.treatPatient(); //add code specific to Surgeon }
يمكن استخدام الكلمة الأساسية super للوصول إلى أي عضو بيانات أو أساليب للفئة الفائقة في الفئة الفرعية.
بعد ذلك، سوف نتعرف على الكلمة المفتاحية Super، وراثة وتعدد الأشكال في Java مع أمثلة البرامج.
مثال: - لتعلم الوراثة وتعدد الأشكال والكلمات الرئيسية الفائقة
الخطوة 1) انسخ الكود التالي إلى المحرر
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overriden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
الخطوة 2) حفظ وتجميع وتشغيل التعليمات البرمجية. مراقبة الإخراج.
الخطوة 3) خطوط Uncomments # 6-9. حفظ وتجميع وتشغيل التعليمات البرمجية. مراقبة الإخراج.
الخطوة 4) قم بإلغاء التعليق على السطر رقم 10. حفظ وتجميع التعليمات البرمجية.
الخطوة 5) خطأ = ؟ وذلك لأن الفئة الفرعية لا يمكنها الوصول إلى الأعضاء الخاصين في الفئة الفائقة.
الملخص
- يحدث تعدد الأشكال في البرمجة الشيئية عندما يكون هناك فئة واحدة أو أكثر أو كائنات مرتبطة ببعضها البعض عن طريق الميراث. إنها قدرة الكائن على اتخاذ أشكال عديدة.
- يؤدي تجاوز الطريقة إلى إعادة تعريف طريقة الفئة الفائقة في فئة فرعية.
- تعدد الأشكال الديناميكي في Java هي الآلية التي يمكن من خلالها تعريف طرق متعددة بنفس الاسم والتوقيع في الفئة الفائقة والفئة الفرعية.
- تعدد الأشكال الساكن في Java هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت الترجمة، في حين أن تعدد الأشكال الديناميكي هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت التشغيل.
- يمكن استخدام الكلمة الأساسية Super للوصول إلى أساليب الفئة الأصلية من الفئة الفرعية.