JavaRush /مدونة جافا /Random-AR /العلاقات بين الطبقات. الميراث والتكوين والتجميع

العلاقات بين الطبقات. الميراث والتكوين والتجميع

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

الوراثة في جافا وفوائدها

كما تتذكر على الأرجح، فإن الميراث هو آلية تسمح لك بوصف فئة جديدة بناءً على فئة (أصلية) موجودة. في هذه الحالة، يتم استعارة خصائص ووظائف الفئة الأصلية بواسطة الفئة الجديدة. ولنتذكر مثال الميراث من المحاضرات السابقة:
public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       //...gas
   }

public void brake() {
       //...brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
هناك برنامج معين نعمل من خلاله مع أنواع مختلفة من السيارات. حتى لو لم تكن من عشاق السيارات، فمن المحتمل أنك تعلم أن هناك عددًا كبيرًا من أنواع هذه السيارات نفسها في العالم :) لذلك، نقوم بفصل الخصائص العامة للسيارات إلى فئة أصلية مشتركة - Car. ما هو القاسم المشترك بين جميع السيارات بغض النظر عن نوعها؟ أي سيارة لها سنة الصنع واسم الموديل والسرعة القصوى. نضع هذه الخصائص في الحقول model, maxSpeed. yearOfManufactureأما بالنسبة للسلوك فيمكن لأي سيارة أن تتسارع وتفرمل :) ونحدد هذا السلوك في الأساليب gas()و brake(). ما هي الفوائد التي يقدمها لنا هذا؟ بادئ ذي بدء، تقليل كمية التعليمات البرمجية. بالطبع، يمكننا الاستغناء عن الفصل الأصلي. ولكن بما أن كل سيارة يجب أن تكون قادرة على التسارع والفرامل، فسيتعين علينا إنشاء طرق gas()في brake()الفصل Truck، في الفصل Sedan، F1Carفي الفصل، Sportcarوفي جميع فئات السيارات الأخرى. تخيل مقدار الكود الإضافي الذي سنكتبه في هذه الحالة. لا تنس حقول النموذج وmaxSpeed ​​​​وyearOfManufacture: إذا تخلينا عن الفئة الأصلية، فسنقوم بإنشائها في كل فئة من فئات الآلة! العلاقات بين الطبقات.  الوراثة والتكوين والتجمع - 2 عندما يكون لدينا بضع عشرات من فئات الآلات، فإن كمية التعليمات البرمجية المتكررة ستصبح خطيرة حقًا. إن نقل الحقول والأساليب الشائعة (وتسمى أيضًا "الحالة" و"السلوك") إلى الفصل الأصلي سيسمح لنا بتوفير الكثير من الوقت والمساحة. فإذا كان لنوع معين خصائص أو أساليب تنفرد به فقط وتغيب عن الأنواع الأخرى من الآلات، فلا يهم. ويمكن دائمًا إنشاؤها في فئة تابعة، بشكل منفصل عن جميع الفئات الأخرى.
public class F1Car extends Car {

   public void pitStop() {

       //...only racing cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
خذ حالة سيارات السباق الفورمولا 1. إنهم، على عكس "أقاربهم"، لديهم سلوك فريد من نوعه - من وقت لآخر يقومون بالتوقف. هذا لا يزعجنا. لقد وصفنا بالفعل السلوك العام في الفصل الأصلي Car، ويمكننا إضافة سلوك محدد للفئات الفرعية داخل الفصول. العلاقات بين الطبقات.  الوراثة والتكوين والتجمع - 3 ينطبق هذا أيضًا على الحقول: إذا كانت فئة فرعية لها خصائص فريدة، فيمكننا الإعلان عن هذه الحقول بداخلها بهدوء ولا تقلق :) القدرة على إعادة استخدام الكود هي الميزة الرئيسية للميراث. من المهم جدًا بالنسبة للمبرمج ألا يكتب كميات غير ضرورية من التعليمات البرمجية. سوف تواجه هذا أكثر من مرة في عملك. من فضلك تذكر شيئًا آخر مهم جدًا: لا يوجد وراثة متعددة في Java. كل فئة ترث من فئة واحدة فقط. سنتحدث عن أسباب ذلك بمزيد من التفصيل في المحاضرات القادمة، لكن تذكر الآن فقط. وهذا، بالمناسبة، يميز Java عن بعض لغات OOP الأخرى. على سبيل المثال، يحتوي C++ على وراثة متعددة. مع الميراث، كل شيء أكثر أو أقل وضوحا - دعنا ننتقل.

التكوين والتجميع

يمكن أن تكون الفئات والكائنات مرتبطة ببعضها البعض. يصف الميراث العلاقة "هي" (أو بالإنجليزية "IS A"). ليو حيوان. يمكن التعبير عن هذه العلاقة بسهولة باستخدام الميراث، حيث Animalسيكون الفصل هو الوالد والفصل Lionهو الابن. ومع ذلك، لا يتم وصف جميع العلاقات في العالم بهذه الطريقة. على سبيل المثال، من المؤكد أن لوحة المفاتيح متصلة بالكمبيوتر بطريقة ما، ولكنها ليست كمبيوتر . ترتبط الأيدي بطريقة أو بأخرى بالشخص، لكنها ليست الشخص. في هذه الحالات، يعتمد على نوع مختلف من العلاقة: ليس "هو"، بل "هو جزء" ("HAS A"). اليد ليست شخصًا، ولكنها جزء من الشخص. لوحة المفاتيح ليست كمبيوتر، ولكنها جزء من الكمبيوتر. يمكن وصف علاقات HAS A في التعليمات البرمجية باستخدام آليات التركيب والتجميع . والفرق بينهما يكمن في "صرامة" هذه الروابط. دعونا نعطي مثالا بسيطا: لدينا سيارة خاصة بنا. كل سيارة لديها محرك. وبالإضافة إلى ذلك، كل سيارة لديها ركاب في الداخل. ما هو الفرق الأساسي بين الحقول و ؟ إذا كانت السيارة بداخلها راكب ، فهذا لا يعني أنه لا يمكن أن يكون هناك ركاب فيها . سيارة واحدة يمكن أن تستوعب عدة ركاب. بالإضافة إلى ذلك، إذا تم إخراج جميع الركاب من السيارة، فسوف تستمر في العمل بهدوء. العلاقة بين الطبقة وكتلة الركاب أقل صرامة. ويسمى التجميع . هناك مقال جيد حول هذا الموضوع: العلاقات بين الفئات (الكائنات) . ويقدم مثالا جيدا آخر للتجميع. لنفترض أن لدينا فصلًا يدل على الطالب، وفصلًا (مجموعة من الطلاب). يمكن للطالب أن يكون عضوًا في نادي الفيزياء أو نادي المعجبين بطلاب Star Wars أو فريق KVN. التكوين هو نوع أكثر صرامة من التواصل. عند استخدام التركيب، لا يكون الكائن جزءًا من كائن ما فحسب، بل لا يمكن أيضًا أن ينتمي إلى كائن آخر من نفس النوع. أبسط مثال هو محرك السيارة. المحرك جزء من السيارة، لكنه لا يمكن أن يكون جزءًا من سيارة أخرى. كما ترون، فإن اتصالهم أكثر صرامة من اتصال و . CarEngine enginePassenger [] passengersАBCCarPassenger [] passengersStudentStudentsGroupCarPassengersالعلاقات بين الطبقات.  الميراث والتكوين والتجمع - 4
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION