0% found this document useful (0 votes)
164 views35 pages

OOP With Java Week 9, 10 Polymorphism

Uploaded by

Yousef Al-Ashqar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
164 views35 pages

OOP With Java Week 9, 10 Polymorphism

Uploaded by

Yousef Al-Ashqar
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 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