هذه المفاهيم تتكرر كثيرًا خاصة عند دراستي لأنماط التصميم بالجافا Design patterns، ربما لدي فهم متواضع لها، لكن أريد أن أصل لفلسفة هذه المفاهيم بوضوح أكثر.
ملحوظة: تذكر هدف المجتمع .. يعني إذا قرأ طفل الخامسة إجابتك فأرجو أن يفهمها :)
Composition يمكن ان نفهمها بعلاقة ( has a - يملك )
مثل الحاسوب يملك لوحة مفاتيح
inheritance نفهمها بعلاقة (is a - مثل )
الحاسب المحمول مثل الحاسب المكتبي
هناك امور مشتركة بينهما لا داعي لاعادة تعريفها عند الابن مجددا نقوم بوراثتها من الاب
Polymorphism
هو اعادة تعريف نفس التابع الموجود عند الاب بطريقة اخرى عند الابن
لدينا تابع في الكلاس الاب اسم التابع draw يقوم هذا التابع برسم مستطيل عند الاب
نعيد تعريف نفس هذا التابع من اجل رسم مربع
نفس اسم التابع والمعاملات عند الاب والابن ولكن غير تنفيذ (implementation )
ال inheritance شرحها عبد الرحمن،
Polymorphism من الممكن ان نعربها الى تعدد الاوجه،
والمقصود منها عمل اكثر من كلاس يمكن معاملتهم كـ كلاس واحد، مثلاً تخيل لدينا Button وهذا الزر لديه ميثود لتنفيذ حدث معين عند النقر عليه
btn.addActionListener(action);
الان، كيف سنقوم بتحديد نوع الاكشن الذي سيستقبله هذا الميثود مع السماح للمبرمج بالتعديل عليه وبرمجته كما يحلو له ؟ ببساطة سنقوم بعمل Interface تحتوي على الميثودات التي تهمنا والتي سنستخدمها داخل الميثود addActionListener، مثلاً
public interfrace Action {
public void clicked();
}
والان بامكان اي مبرمج عمل Implements لل Action ثم تعديلها وتطويرها واضافة ما يحلو له من ميثودات جديدة، ومع ذلك ما زلنا نستطيع استخدامها في
btn.addActionListener(action);
مثلاً
public class MyAction Implements Action {
public void clicked() {
//what ever he wants
}
private void xxx(){//whatever he wants}
protected void yyy(){//whatever he wants}
}
ايضاً يمكن استخدامه في حالة لدينا مهمة معينة، لكن يمكن تنفيذها بأكثر من طريقة،
مثلاً لنفرض ان لدينا ميثود تقوم بارسال رسالة، هذه الميثود تتوقع ان يتم تمرير كائن لها، ثم تقوم باستدعاء ميثود send لهذا الكائن، ولا يهمها ماذا تفعل هذه ال send سواء ترسل رسالة للبريد الالكتروني او للهاتف او الواتساب زز الخ !
بنفس الطريق السابقة نقوم بعمل Interface وليكن اسمها Message و تحتوي على ميثود send ثم نقوم عمل Implements لها في كلاسات اخرى مثلاً EmailMessage او SMSMessage الخ .. ثم يصبح بامكاننا ان نمرر اي كائن من هذه الكلاسات الى تلك الميثود التي ترغب بارسال رسالة، وبنائاً على الكلاس الذي تم تمريره ترسل اما الى البريد او الهاتف او ..
Composition هو استخدام كلاس داخل كلاس اخرى عندما تكون على علاقة معها لكن بنفس الوقت ليست مشتقاتها،
مثلاً لنفرض في المثال السابق قمنا بانشاء كلاس لارسال ايميل ترث من كلاس لارسال رسالة بشكل عام (من مشتقاتها)، ونريد ان نضيف خاصية تسجيل الاخطاء التي تحدث باستخدام كلاس اخرى (على علاقة لكن ليست من مشتقاتها)،
هذا ما نقوم به:
public class SendEmail extends Send {
private Logger logger;
// etc ..
}
في حال اعتمدنا دائماً على ال Composition فسنخسر ال Polymorphism (مهم جداً خصوصاً عند اضافة ميزات اخرى للمشروع مستقبلاً) ولا يمكننا الاعتماد دائماً على ال inheritance لان الكود يصبح جحيماً، ومعظم لغات البرمجة تمنع وراثة اكثر من كلاس.
inheritance تعني الوراثة لكن مفهومها هي إعادة استخدام ما هو موجود أو الانتفاع بأمر حاصل دون الاضطرار للإعادة
سيارة تقل طالب إلى المدرسة عبر خط محدد
ثم وجد طالب آخر يقع بيته على نفس الطريق
فبدلاً من تخصيل حافلة مستقلة له أو جعل الحافلة توصل الطالب الأول ثم تعود لتوصل الثاني
نجعل الباص نفسه يقف في الطريق ويأخذ الطالب الثاني معه.
لديك شاحنة تتسع لخمسة أطنان من الرمل وبعد زمن احتجنا لشاحنة بسعة عشرة أطنان
فبدلاً من إعادة تصنيع واحدة أكبر نقوم باستخدام نفس الشاحنة مع إضافة حاوية مقطورة إضافية بسعة خمسة أطنان و يتم ربطها بالشاحنة السابقة.
كنت أفهم الموضوع بنفس الطريقة التي شرحتها، ما أن تعرفت قليلا عن مبدأ التركيب Composition حتى ظهر سؤال، ما فائدة الوراثة إذا كان يمكنك إنجاز الأمر عبر مبدأ التركيب؟ بعض المقالات تشير أيضًا أن التركيب أفضل كثيرًا. ربما لأني لم أبدأ بتطوير مشروع كبير لازلت لا أشعر بهذه الفروق التي يتحدثون عنها.
هناك فرق لكن قد يكون صعب شرحه بطريقة يفهمها من هو بالخامسة ツ
التجميع يختلف عن التوريث بحسب العلاقة من كونه Is A أو Has A
سأضطر لضرب مثال واقعي حصل معي لكن لن أتقيد بسن المتلقي.
عندما كونت صنف يعبر عن كائن الشخص فجعلت الخصائص الداخلية هي التي ترتبط بالشخص مثل الاسم وتاريخ المولد وجنسه
الآن عندما أردت صنف يمثل الموظف قمت بوراثته من الشخص مع إضافة عدة خصائص تتعلق بالشخص من كونه موظف مثل المسمى الوظيفي وتاريخ التحاقه بالعمل
قمت بتشكيل صنف مستقل يعبر عن معلومات الاتصال مثل رقم الجوال والهاتف والبريد الإلكتروني
وكذلك صنف يمثل الموقع الجغرافي من حيث العنوان بالتفصيل و والدولة والمدينة ورابط الخارطة
من المعلوم أن من خصائص الشخص هو معلومات التواصل و كذلك موقعه الجغرافي
هنا لا يصح أن أرث صنف الشخص من صنف أو إنترفيس الموقع و معلومات التواصل
وإنما اجعل داخله خاصية من نوع تلك الأصناف وهذا ما أفهمه أن يمثل التركيب إلا إذا كان له دلالات أخرى لم أعرفها بعد.
الحالة السابقة جاءت من أن الشخص ليس معلومات تواصل أي ليس Is A وإنما الشخص يمتلك معلومات تواصل أي Has A
بينما صحت الوراثة بين الموظف من الشخص لأن الموظف هو شخص أي تحققت العلاقة Is A و لا يصح أن نقول أن الموظف يمتلك شخص أي ليس Has A
التعليقات