You are on page 1of 35

‫‪ ‬للجار على جاره حقوق و آداب‬ ‫ض َي هَّللا ُ َع ْنهُ قال‪،‬‬ ‫ع ن أ بي ذر َر ِ‬

‫باتباعها ننجو و نفوز بالجنة و بتركها‬


‫نخسـر خسرانا مبينا ‪.‬‬ ‫ص لَّى هَّللا ُ َعلَي ِْه‬
‫قال َر ُس ول هَّللا ِ َ‬
‫َو َس لَّم‪( :‬ي ا أب ا ذر إذا‬
‫‪ ‬أن يشاركه في أفراحه و أحزانه‪.‬‬
‫‪‬أن يأمره بالمعروف بمعروف و أن‬
‫ينهاه عن المنكر بدون منكر‪.‬‬
‫‪‬أن يظهر له محبته من خالل إهداءه‬
‫الهدايا المختلفة‪.‬‬ ‫طبخ ت مرق ة فأكث ر‬
‫‪‬أن يحفظ ماله و عرضه فكل صورة و‬

‫‪‬أن يجعله دائما يشعر باألمان من جانبه‬


‫حال‬
‫ماءه ا وتعاه د‬
‫جيرانك)‬
‫َر َواهُ ُم ْسلِ ٌم‪.‬‬
‫(‪)Polymorphism‬‬ ‫‪ ‬مفهوم تعدد األشكال‬

‫‪ ‬لماذا تعدد األشكال ؟‬

‫‪ ‬أمثلة نحتاج فيها تعدد األشكال ؟‬

‫‪Overridden ‬‬

‫‪Abstract Classes and Methods‬‬ ‫‪ ‬األصناف و الدوال المجرد‬

‫‪ ‬مثال تطبيقي على تعدد األشكال‬

‫‪ ‬مفهوم العالقة ‪ is – a‬و تطبيقها‬


‫مفهوم تعدد األشكال ‪Polymorphism‬‬

‫‪ ‬مفهوم تعدد األشكال يس مح لن ا بكتاب ة برام ج ف ي ص ورة قابل ة للتغيي ر بشك ل واس ع‬

‫النطاق؛ س واء كان التغيي ر لفئات موجودة مس بقا ً أ و تغيي ر مس تقبلي إلنتاج برام ج‬

‫جديدة‪.‬‬

‫‪ ‬هذه الخاصية تسهل علينا توسيع قدرات نظامنا ‪ .‬و تجعله أكثر مرونه‪.‬‬

‫‪ ‬م ن خالل ه يت م تعري ف أص ناف عام ة ً‬


‫جدا ف ي الص فات و الس لوك ث م بع د ذل ك يت م‬

‫تخص يصها أكث ر فأكث ر م ن خالل تط بيق مخص ص للس لوك و تعري ف المزي د م ن‬

‫المتغيرات‪.‬‬
‫مفهوم تعدد األشكال ‪Polymorphism‬‬

‫عام جدا‬
‫شكل‬
‫هندسي‬
‫التخصص‬
‫ثنائي األبعاد‬ ‫ثالثي األبعاد‬

‫‪+‬‬
‫خاص جدا‬

‫مستطيــل‬ ‫مثلث‬ ‫دائرة‬


‫لماذا تعدد األشكال ؟‬

‫‪ ‬تحقيق لمباديء البرمجة الشيئية ‪.‬‬

‫‪ ‬توسيع لمفهوم الوراثة‪.‬‬

‫‪ ‬إنتاج مشاريع برمجيـة أكثر ليونة و قدرة على التطور‪.‬‬


‫عالقة تعدد األشكال بالوراثـة ‪...‬‬

‫‪ ‬مفهوم تعدد األشكال هو مفهوم أكثر عمقـًا و تخصصـا من مفهوم الوراثة‪.‬‬

‫الطرق و‬
‫تغيير طريقة‬
‫األصناف‬
‫تطبيق الدوال‬
‫الوراثـة‬
‫المجردة‬

‫تعدد‬
‫األشكال‬
‫أمثلة نحتاج فيها تعدد األشكال ؟‬

‫مثال أول‪( :‬حركـة الحيوانات)‬

‫‪ ‬عندي صنف الحيوان ‪ ,‬و منشق منه الضفدع ‪ ,‬السمكة ‪ ,‬الطيور و المعروف أن‬

‫كل الحيوانات تتحرك و تغير موضعها و لكن طريقة حركتها و مقدارها يتغير من‬

‫صنف آلخر‪.‬‬

‫‪ ‬في هذه الحالة نستخدم تعدد األشكال لنقوم بتطبيق الصنف (حيوان) و به السلوك‬

‫(حركة) و لكن دون أن نقوم بتعريف كيفية حدوث الحركة ثم نقوم في األصناف‬

‫المشتقة بتعريف كيفية حدوث الحركة لكل صنف من األصناف‪.‬‬


‫أمثلة نحتاج فيها تعدد األشكال ؟‬

‫مثال ثاني‪( :‬حساب مساحة األشكال الهندسيـة)‬

‫‪ ‬يوجد صنف عام اسمه (شكل هندسي) له أبعاد و مساحة و محيط ‪ ,‬و قمنا‬
‫باشتقاق مربع ‪ ,‬مستطيل‪ ,‬دائرة ‪ ,‬اسطوانة منه و لكل واحد منهم مساحة و محيط‬
‫يتم حسابهم بطريقة مختلفة لكل منهم كما نعلم‪.‬‬

‫‪ ‬في هذه الحالة نستخدم تعدد األشكال لنقوم بتطبيق الصنف (شكل هندسي) و به‬
‫السلوك (حساب المساحة و المحيط) و لكن دون أن نقوم بتعريف كيفية حسابهم ثم‬
‫نقوم في األصناف المشتقة بحسابهم لكل صنف من األصناف بالطريقة المناسبة‪.‬‬
‫‪Overridden Methods‬‬

‫‪ ‬قبل ذلك تعرضنا لمفهوم التحميل الزائد للدوال ‪ ...‬أتذكره ؟‬

‫‪ ‬اليوم نستعرض مفهوم جديد يتعلق بالدوال هو ‪ Overridden‬و هو يطبق على‬

‫مستوى الدوال الموجودة ضمن أكثر من صنف‪...‬‬

‫‪ ‬و فيه يتم في الصنف االبن (‪ )subclass‬تغيير طريقة تطبيق دالة من دوال‬

‫األب‪ ,‬و بذلك يصبح كال من االبن و األب لديهما دالة لها نفس االسم لكن طريقة‬

‫عملها مختلفة‪.‬‬
Super class Overridden Methods
public int calcsal(int x){
sal = days*x; Super obj1 = new Super ();
return sal; int x = obj. ;Calcsal(20)
}

Sub class

public int calcsal(int x){ Sub obj2 = new Super ();


sal = (days*x)- absent; int x = obj. ;Calcsal(20)
return sal;
}
‫مالحظات حول ‪Overridden Methods‬‬

‫‪ ‬لتطبيق مفهوم ‪ Overridden‬في الصنف األبن يجب أن يكون اسم الدالة و عدد‬
‫و نوع القيم الممررة لها مماثل لهم في األب و التغيير يكون فقط في التطبيق‪.‬‬

‫‪ ‬عندما نحاول عمل ‪ Override‬لدالة من الصنف األب لها حماية أكثر من‬
‫‪ public‬فهذا يُنتج لنا خطأ برمجي (‪ ... )Syntax error‬أتعلم لماذا؟!‬

‫‪ ‬االبن ال يُسمح له بعمل ‪ Override‬لدالة ‪. static‬‬

‫‪ ‬يمكن استدعاء الـ ‪ Overridden method‬داخل االبن من خالل سبقها بالكلمة‬


‫‪;)(Super.method‬‬ ‫‪Super‬‬
‫الصنف المجرد ‪Abstract Class‬‬
‫‪ ‬في األصناف السابقة كان بإمكاننا اشتقاق كائنات منها و التعامل معها ‪ ,‬هذه األصناف‬
‫تسمى ‪.Concrete class‬‬

‫‪ ‬هناك نوع آخر من األصناف ال يُسمح باشتقاق كائنات منه بل يتم فقط اتخاذه كأب‬
‫(‪ )Parent‬و هذه تسمى األصناف المجردة ‪.Abstract class‬‬

‫‪ ‬يتم تعريف الصنف من النوع المجرد من خالل إضافة كلمة ‪ Abstract‬قبل الكلمة‬

‫{ ‪public abstract class Employee‬‬ ‫المحجوزة ‪. class‬‬


‫‪//….‬‬
‫}‬
‫‪ ‬و الغرض منه أن يتم توفير صنف عام يمكن لألبناء أن يشتقوا منه و أن يشتركوا جميعا‬
‫في تصميم واحد و لكن لكل واحد منهم طريقا ما في التطبيق و العمل‪.‬‬
‫الصنف المجرد ‪Abstract Class‬‬

‫‪ ‬الصنف المجرد يحتوي على دالة أو أكثر مجردة و هذه الدوال يجب أن يتم عمل‬
‫‪ override‬لها في االبناء لكي تصبح االبناء ‪.concrete classes‬‬

‫‪ ‬الدوال و المتغيرات الغي ر مجردة ف ي الص نف المجرد تخض ع لقواع د الوراث ة‬


‫العامة عند توريث هذا الصنف لألبناء‪.‬‬

‫‪ ‬محاولة إشتقاق كائن من الصنف المجرد ينتج عنه ‪.Compilation error‬‬

‫‪ ‬مثال الستخدام الصنف المجرد‪ :‬يمكننا كتابة ‪ Abstract Class‬لتمثيل األشكال‬


‫الهندسية ثنائية األبعاد و بعد ذلك نشتق منه ‪ concrete classes‬للمربع و‬
‫الدائرة و المستطيل‪.‬‬
‫الدالة المجردة ‪Abstract method‬‬

‫‪ ‬الصنف المجرد يجب أن يحتوي على األقل على دالة من النوع المجرد ‪Abstract‬‬
‫‪.method‬‬

‫‪ ‬و الدالة المجردة هي دالة يتم فقط تعريفها في الصنف دون عمل تطبيق لها‪ ,‬حيث يتم عمل‬
‫التطبيق من خالل االبناء ‪ subclass‬مستخدمين مفهوم ‪. overridden‬‬
‫{ ‪public abstract class Employee‬‬
‫‪//---‬‬
‫;)(‪public abstract void calcSal‬‬

‫}‬
‫حاالت الطرق في األصناف المشتقة‬

‫الدالة في الصنف االبن‬

‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬


‫‪New Methods‬‬ ‫‪Overridden Methods‬‬ ‫‪Inherited Methods‬‬
‫أـــن يتـــم عمـــل ‪Override‬‬ ‫أــن يرث الصــنف االبــن دوال‬
‫أـــــن يتــــم إنشاء دوال جديدة‬
‫لدوال االب فيتـــم اعادة كتابـــة‬ ‫مـن االب كاملـة كمـا هـي دون‬
‫مسـتقلة عـن دوال االب و هذه‬
‫دالـة االب بذات االسـم و القيـم‬ ‫تغييــر أ ــو تعديــل و ف ــي هذه‬
‫الدوال ال تســـــتدعى إال مـــــن‬
‫الممررة و لكـــن يتـــم تغييـــر‬ ‫الحالــة يمكــن اســتدعاء هذه‬
‫خالل كائنات االبـن و احفاده و‬
‫طريقـة العمـل و بالتالـي عنـد‬ ‫الدالــة باســتخدام كائنات مــن‬
‫ال تســتدعى مــن خالل كائنات‬
‫اسـتدعاء هذه الدالـة باسـتخدام‬ ‫االب و االبـــــــن و فـــــــي كال‬
‫االب‬
‫كائـن مـن االبـن فيتـم اسـتدعاء‬ ‫الحالتيــن يتــم اســتدعاء تنفيــذ‬
‫الدالة من االبن ال من االب‬ ‫الدالة من االب‬
‫تدريب ‪: 1‬بناء مجموعة أصناف لتمثيل الموظف‬
‫‪ ‬مستخدمـًا مفاهيم الوراثة و تعدد األشكال ‪ ,‬قم ببناء أصناف عن الموظف حسب‬
‫طريقة حصوله على مستحقاته ‪...‬‬
‫تدريب ‪: 1‬رسم توضيحي ليهكلية األصناف‬
Abstract Superclass Employee ‫إنشاء‬
‫إنشاء ‪Abstract Superclass Employee‬‬

‫انتبه قمنـا بتعريف هذا الصنف‬


‫بالكلمة ‪ abstract‬و بالتالي البد‬
‫أن يحتوي على دالة واحدة على‬
‫األقل من النوع ‪ abstract‬و إال‬
‫سيعتبر خطأ برمجي‬
‫إنشاء ‪Abstract Superclass Employee‬‬

‫انتبـــه‪ :‬هذه هـــي الدالـــة‬


‫المجردة (أـي مجردة مـن‬
‫التطـبيق) و يتـم تعريفهـا‬
‫فقــط مــن خالل التوقيــع‬
‫(نوعهـا‪ ,‬اسـمها ‪ ,‬قيمهـا)‬

‫و تذكــر أــن مــن دونهــا‬


‫فإـــــن هذا الصـــــنف ال‬
‫يعتبر مجرد!!‬
Concrete Subclass SalariedEmployee ‫إنشاء‬
‫إنشاء ‪Concrete Subclass SalariedEmployee‬‬

‫استدعاء صريح‬
‫للـ‪constructor‬‬
‫الخاص باألب بقيم ممررة‬
‫عبر الكائن المشتق من‬
‫االبن‪.‬‬

‫حســاب ألجره االســبوع مــن‬


‫خالل جملة شرطية‪.‬‬
‫إذا كان المرتـب أقـل مـن صـفر‬
‫اجعــــل قيمتــــه صــــفر و إال‬
‫فالمرتب هو القيمة المرسلة‬
‫إنشاء ‪Concrete Subclass SalariedEmployee‬‬

‫هنا قمنا بعمل ‪ override‬للدالة ‪ earnings‬من خالل‬


‫تغيير طريقة حساب المرتب بينما احتفظنا بتوقيع الدالة‬

‫هنا قمنا بعمل ‪ override‬للدالة ‪ info‬من خالل‬


‫تغيير طريقة إرجاع البيانات و استدعينا أيضا دالة‬
‫االب من خالل ‪)(super.info‬‬
Concrete Subclass CommissionEmployee ‫إنشـاء‬
Concrete Subclass CommissionEmployee ‫إنشـاء‬
Concrete Subclass CommissionEmployee ‫إنشـاء‬
‫إنشـاء ‪Concrete Subclass HourlyEmployee‬‬

‫أترك إنشاء هذا الصنف لكم كتدريب عل ًما َّ‬


‫بأن مرتب هذا النوع من‬
‫الموظفين يحسب من خالل عدد ساعات العمل مضروبا في أجرة‬ ‫تدريب ذاتي ‪1‬‬
‫الساعة الواحدة‬
Indirect Concrete Subclass BasePlusCommissionEmployee ‫إنشـاء‬
Indirect Concrete Subclass BasePlusCommissionEmployee ‫إنشـاء‬
‫إنشـاء ‪Indirect Concrete Subclass BasePlusCommissionEmployee‬‬

‫هنا قمنا بعمل ‪ override‬للدالة ‪ earnings‬من خالل‬


‫تغيير طريقة حساب المرتب فيصبح المرتب األساسي‬
‫مجموعا له العمولة على كل البيع و التي يتم الحصول‬
‫عليها مباشرة من االب‬
‫مفهوم العالقة ‪ is – a‬و تطبيقها‬

‫‪ ‬عالقة الوراثـة أحيانا تسمى ‪ is-a‬و معناها أن كل كائن من الفصيلة الفرعية (االبن)‬
‫يعتبر كائنـًا من الفصيلة األساسية (األب)‪.‬‬

‫‪ ‬و بالتالي يمكن استخدام كائن من الفصيلة الفرعية مكان كائن من الفصيلة األساسية‪.‬‬

‫‪ ‬مثال‪ :‬موظف األجر الثابت و العمولة هو موظف عمولة و هو في األصل موظف‪.‬‬

‫‪ ‬بذلك في الحاالت التي تتطلب إرسال كائن من صنف أساسي فيمكنني إرسال كائن‬
‫من أي صنف من األصناف الفرعية‪.‬‬

‫‪ ‬مثال‪ :‬نقل مبلغ من حساب بنكي لحساب آخر من أي نوع‪.‬‬


‫مثال ‪:‬مفهوم العالقة ‪: is – a‬‬

‫مثال الحســاب البنكي‬


: is – a ‫مفهوم العالقة‬: ‫مثال‬

public void transfer (BankAccount other , double amount){


withdraw(amount);
other.deposit(amount);
}

‫ فيمكن‬BankAccount ‫ و حيث أن جميع فصائل البنك هي مشتقة من الفصيلة‬


transfer ‫تمرير أي كائن من أي فصيلة للدالة‬

BankAccount c1 = new BankAccount(1000);


CheckingAcount c2 = new CheckingAccount(2000);

C1.transfer(c2,500);

You might also like