تعدد الأشكال في Java OOPs مع مثال: ما هو ديناميكي

ما هو تعدد الأشكال في جافا؟

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

على سبيل المثال، لديك هاتف ذكي للتواصل. يمكن أن يكون وضع الاتصال الذي تختاره أي شيء. يمكن أن تكون مكالمة، رسالة نصية، رسالة مصورة، mailإلخ. لذا فالهدف مشترك وهو التواصل، لكن منهجهم مختلف. هذا يسمي تعدد الأشكال. الآن، سوف نتعلم تعدد الأشكال في جافا مع المثال.

في هذا جافا البرنامج التعليمي، سوف تتعلم-




انقر هنا إذا لم يكن من الممكن الوصول إلى الفيديو

تعدد أشكال جافا في 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 تعدد الأشكال وقت التشغيل

الفرق بين تعدد الأشكال الثابت والديناميكي

تعدد الأشكال الساكن في جافا هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت الترجمة، في حين أن تعدد الأشكال الديناميكي هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت التشغيل.

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

مثلا:

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();

سوبر Keyword في جافا

ماذا لو كانت طريقة TreatPatient في فئة Surgeon تريد تنفيذ الوظيفة المحددة في فئة Doctor ثم أداء وظيفتها المحددة؟

في هذه الحالة، الكلمة الرئيسية superيمكن استخدامها للوصول إلى أساليب الفئة الأصل من فئة فرعية.

يمكن كتابة طريقة TreatPatient في فئة Surgeon على النحو التالي:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

يمكن استخدام الكلمة الأساسية super للوصول إلى أي عضو بيانات أو أساليب للفئة الفائقة في الفئة الفرعية.

بعد ذلك، سوف نتعرف على الكلمة المفتاحية Super، وراثة وتعدد الأشكال في جافا مع أمثلة البرامج.

مثال: - لتعلم الوراثة وتعدد الأشكال والكلمات الرئيسية الفائقة

الخطوة 1) انسخ الفولوwing رمز في محرر

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 هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت الترجمة، في حين أن تعدد الأشكال الديناميكي هو نوع من تعدد الأشكال الذي يجمع المعلومات لاستدعاء الطريقة في وقت التشغيل.
  • فائق الكلمة يمكن استخدامها للوصول إلى أساليب الفئة الأصل من فئة فرعية.