JavaRush /مدونة جافا /Random-AR /ممارسة استخدام تعدد الأشكال

ممارسة استخدام تعدد الأشكال

نشرت في المجموعة
مرحبًا! اليوم ننتهي من سلسلة محاضرات حول مبادئ OOP . في هذا الدرس سنتحدث عن تعدد الأشكال. ممارسة استخدام تعدد الأشكال - 1تعدد الأشكال هو القدرة على التعامل مع أنواع متعددة كما لو كانت نفس النوع. في هذه الحالة، سيكون سلوك الكائنات مختلفًا اعتمادًا على النوع الذي تنتمي إليه. دعونا ننظر إلى هذا البيان بمزيد من التفصيل. لنبدأ بالجزء الأول: "القدرة على العمل مع أنواع متعددة كما لو كانت نفس النوع". فكيف يمكن للأنواع المختلفة أن تكون واحدة ونفس الشيء؟ يبدو غريبا بعض الشيء :/ إنه في الواقع بسيط. على سبيل المثال، ينشأ هذا الموقف مع الاستخدام العادي للميراث. دعونا نرى كيف يعمل. لنفترض أن لدينا فئة رئيسية بسيطة Catذات طريقة واحدة run()- "تشغيل":
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
لنقم الآن بإنشاء ثلاث فئات ترث من Cat: Lionو Tigerو Cheetah، للدلالة على الأسد والنمر والفهد.
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Лев бежит со speedю 80 км/ч");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Тигр бежит со speedю 60 км/ч");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Гепард бежит со speedю до 120 км/ч");
   }
}
لذلك لدينا 3 فصول. دعونا نحاكي موقفًا حيث يمكننا العمل معهم كما لو كانوا من نفس الفصل. لنتخيل أن إحدى قططنا مريضة وتحتاج إلى مساعدة الدكتور أيبوليت. دعونا نحاول إنشاء فصل دراسي Aibolitيمكنه علاج الأسود والنمور والفهود.
public class Aibolit {

   public void healLion(Lion lion) {

       System.out.println("Лев здоров!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Тигр здоров!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Гепард здоров!");
   }
}
يبدو أن المشكلة قد تم حلها - الفصل مكتوب وجاهز للاستخدام. ولكن ماذا سنفعل إذا أردنا توسيع برنامجنا؟ الآن لدينا 3 أنواع فقط: الأسود والنمور والفهود. ولكن هناك أكثر من 40 نوعا من القطط في العالم. تخيل ما سيحدث إذا أضفنا إلى البرنامج فئات منفصلة لقطط بالاس، والجاغوار، وكون ماين، والقطط المنزلية وكل شخص آخر. ممارسة استخدام تعدد الأشكال - 2سيعمل البرنامج نفسه، بالطبع، ولكن Aibolitسيتعين على الفصل إضافة طرق جديدة باستمرار لعلاج كل نوع من القطط، ونتيجة لذلك سوف تنمو إلى أحجام غير مسبوقة. وهنا يأتي دور خاصية تعدد الأشكال - "القدرة على العمل مع عدة أنواع كما لو كانت من نفس النوع". لا نحتاج إلى إنشاء طرق لا حصر لها من شأنها أن تفعل الشيء نفسه - علاج القطة. ستكون طريقة واحدة كافية لجميع الحالات في وقت واحد:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()يمكننا تمرير كل من الكائنات والكائنات Lionإلى الطريقة - فهي جميعًا : TigerCheetahCat
public class Main {

   public static void main(String[] args) {

       Aibolit aibolit = new Aibolit();

       Lion simba = new Lion();
       Tiger sherekhan = new Tiger();
       Cheetah chester = new Cheetah();

       aibolit.healCat(simba);
       aibolit.healCat(sherekhan);
       aibolit.healCat(chester);
   }
}
إخراج وحدة التحكم:

Пациент здоров!
Пациент здоров!
Пациент здоров!
هذه هي الطريقة التي يمكن لفصلنا Айболитالعمل بها مع أنواع مختلفة كما لو كانت من نفس النوع. الآن دعونا نتعامل مع الجزء الثاني: "في هذه الحالة، سيكون سلوك الكائنات مختلفا اعتمادا على النوع الذي ينتمون إليه". كل شيء بسيط هنا أيضًا. في الطبيعة، كل القطط تجري بشكل مختلف. كحد أدنى، تختلف سرعة تشغيلها. من بين حيواناتنا الأليفة الثلاثة، الفهد هو الأسرع، في حين أن النمر والأسد يركضان بشكل أبطأ. أي أن سلوكهم مختلف. إن تعدد الأشكال لا يمنحنا القدرة على استخدام الأنواع المختلفة كنوع واحد فحسب. وفي الوقت نفسه، يسمح لنا بعدم نسيان اختلافاتهم ويحافظ على السلوك الخاص بكل منهم. ويمكن فهم ذلك من خلال هذا المثال. لنفترض أنه بعد التعافي الناجح، قررت قططنا الركض قليلًا للاحتفال. دعونا نضيف هذا إلى صفنا Aibolit:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
دعونا نحاول تشغيل نفس الكود لعلاج ثلاثة حيوانات:
public static void main(String[] args) {

   Aibolit aibolit = new Aibolit();

   Lion simba = new Lion();
   Tiger sherekhan = new Tiger();
   Cheetah chester = new Cheetah();

   aibolit.healCat(simba);
   aibolit.healCat(sherekhan);
   aibolit.healCat(chester);
}
وهذا ما ستبدو عليه النتيجة:

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
هنا نرى بوضوح أنه تم الحفاظ على السلوك المحدد لأشياءنا، على الرغم من أننا مررنا الحيوانات الثلاثة جميعها إلى طريقة، "عممنا" كل منها على Cat. بفضل تعدد الأشكال، تتذكر جافا تمامًا أن هذه ليست مجرد ثلاث قطط، ولكنها على وجه التحديد أسد ونمر وفهد، والتي تعمل بشكل مختلف. هذه هي الميزة الرئيسية لاستخدام تعدد الأشكال - المرونة . عندما نحتاج إلى إنشاء بعض الوظائف المشتركة بين العديد من الأنواع، تتحول الأسود والنمور والفهود ببساطة إلى "قطط". جميع الحيوانات مختلفة، ولكن في بعض المواقف - القطة هي قطة، بغض النظر عن نوعها التي تنتمي إليها :) إليك تأكيد الفيديو لك.
وعندما لا يكون هذا "التعميم" مطلوبا، بل على العكس من ذلك، نحتاج إلى أن يكون سلوك الأنواع مختلفا، فكل نوع يتصرف بشكل مختلف. بفضل تعدد الأشكال، يمكنك إنشاء واجهة واحدة (مجموعة من الأساليب) لمجموعة واسعة من الفئات. ونتيجة لهذا، يتم تقليل تعقيد البرامج. حتى لو قمنا بتوسيع البرنامج ليشمل 40 نوعًا من القطط، فسيظل لدينا أبسط واجهة ممكنة - طريقة واحدة run()لجميع القطط الأربعين.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION