Oop with java lectures 6 polymorphism

Page 1

‫ل‬ ‫محاضرة ‪ : 1‬مقدمة لمساق و مراجعة للاساسيات‬

‫اعداد ‪ :‬ا‪ .‬فاطمة عويدات خليقة‪.‬‬

‫‪2018– 2017‬‬


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

‫(‪)Polymorphism‬‬

‫✓ لماذا تعدد األشكال ؟‬ ‫✓ أمثلة نحتاج فيها تعدد األشكال ؟‬ ‫✓ ‪Overridden‬‬ ‫✓ األصناف و الدوال المجرد‬

‫‪Abstract Classes and Methods‬‬

‫✓ مثال تطبيقي على تعدد األشكال‬ ‫✓ مفهوم العالقة ‪ is – a‬و تطبيقها‬


‫مفهومًتعددًاألشكالً‪Polymorphism‬‬ ‫✓ مفهوم تعدد األشكال يسمح لنا بكتابة برامج في صورة قابلة للتغيير بشكل واسع‬ ‫النطاق؛ سواء كان التغيير لفئات موجودة مسبقاً أو تغيير مستقبلي إلنتاج برامج‬ ‫جديدة‪.‬‬ ‫✓ هذه الخاصية تسهل علينا توسيع قدرات نظامنا ‪ .‬و تجعله أكثر مرونه‪.‬‬ ‫✓ من خالله يتم تعريف أصناف عامة جدا في الصفات و السلوك ثم بعد ذلك يتم‬ ‫تخصيصها أكثر فأكثر من خالل تطبيق مخصص للسلوك و تعريف المزيد من‬ ‫المتغيرات‪.‬‬


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

‫التخصص‬

‫شكلً‬ ‫هندسي‬

‫عام جدا‬ ‫ثنائي األبعاد‬

‫ثالثي األبعاد‬

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

‫دائرة‬

‫مثلث‬

‫مستطيــل‬


‫لماذاًتعددًاألشكالً؟‬ ‫✓ تحقيق لمباديء البرمجة الشيئية ‪.‬‬ ‫✓ توسيع لمفهوم الوراثة‪.‬‬ ‫✓ إنتاج مشاريع برمجيـة أكثر ليونة و قدرة على التطور‪.‬‬


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

‫الوراثـة‬

‫تغيير طريقة‬ ‫تطبيق الدوال‬

‫تعدد‬ ‫األشكال‬

‫الطرق و‬ ‫األصناف‬ ‫المجردة‬


‫أمثلةًنحتاجًفيهاًتعددًاألشكالً؟‬ ‫مثال أول‪( :‬حركـة الحيوانات)‬ ‫✓ عنديًصنفًالحيوانً‪ ,‬وًمنشقًمنهًالضفدعً‪ ,‬السمكةً‪ ,‬الطيورًوًالمعروف أنً‬ ‫كلًالحيواناتًتتحركًوًتغيرًموضعهاًوًلكنًطريقة حركتهاًوًمقدارهاًيتغيرً‬ ‫منًصنفًآلخر‪.‬‬ ‫✓ فيًهذهًالحالةًنستخدمًتعددًاألشكالًلنقومًبتطبيقًالصنفً(حيوان) و بهًالسلوكً‬ ‫(حركة) وًلكنًدونًأنًنقومًبتعريفًكيفيةًحدوثًالحركةًثمًنقومًفيًاألصنافً‬ ‫المشتقةًبتعريفًكيفيةًحدوثًالحركةًلكلًصنفًمنًاألصناف‪.‬‬


‫أمثلةًنحتاجًفيهاًتعددًاألشكالً؟‬ ‫مثال ثاني‪( :‬حساب مساحة األشكال الهندسيـة)‬ ‫✓ يوجدًصنفًعامًاسمهً(شكلًهندسي) لهًأبعادًوًمساحةًوًمحيطً‪ ,‬وًقمناً‬ ‫باشتقاقًمربعً‪ ,‬مستطيل‪ ,‬دائرةً‪ ,‬اسطوانةًمنهًوًلكلًواحدًمنهمًمساحةًوًمحيطً‬

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


‫‪Overridden Methods‬‬ ‫✓ قبلًذلكًتعرضناًلمفهومًالتحميلًالزائدًللدوالً‪ ...‬أتذكرهً؟‬ ‫✓ اليومًنستعرضًمفهومًجديدًيتعلقًبالدوالًهوً‪ Overridden‬وًهوًيطبقًعلىً‬ ‫مستوىًالدوالًالموجودةًضمنًأكثرًمنًصنف‪...‬‬ ‫✓ وًفيهًيتمًفيًالصنفًاالبنً(‪ )subclass‬تغييرًطريقةًتطبيقًدالةًمنًدوالً‬ ‫األب‪ ,‬وًبذلكًيصبحًكالًمنًاالبنًوًاألبًلديهماًدالةًلهاًنفسًاالسمًلكنًطريقةً‬ ‫عملهاًمختلفة‪.‬‬


Super class

public int calcsal(int x){ sal = days*x; return sal; }

Overridden Methods Super obj1 = new Super (); int x = obj. Calcsal(20);

Sub class

public int calcsal(int x){ sal = (days*x)- absent; return sal; }

Sub obj2 = new Super (); int x = obj. Calcsal(20);


‫مالحظاتًحولً‪Overridden Methods‬‬ ‫✓ لتطبيقًمفهومً‪ Overridden‬فيًالصنفًاألبنًيجبًأنًيكونًاسمًالدالةًوًعددً‬ ‫وًنوعًالقيمًالممررةًلهاًمماثلًلهمًفيًاألبًوًالتغييرًيكونًفقطًفيًالتطبيق‪.‬‬ ‫✓ عندماًنحاولًعملً‪ Override‬لدالةًمنًالصنفًاألبًلهاًحمايةًأكثرًمنً‬ ‫‪ public‬فهذاًيُنتجًلناًخطأًبرمجيً(‪ ... )Syntax error‬أتعلمًلماذا؟!‬ ‫✓ االبنًالًيُسمحًلهًبعملً‪ Override‬لدالةً ‪.static‬‬ ‫✓ يمكنًاستدعاءًالـً‪ Overridden method‬داخلًاالبنًمنًخاللًسبقهاًبالكلمةً‬

‫‪Super‬‬

‫;)(‪Super.method‬‬


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

‫{ ‪public abstract class Employee‬‬ ‫‪//….‬‬ ‫}‬

‫✓ وًالغرضًمنهًأنًيتمًتوفيرًصنفًعامًيمكنًلألبناءًأنًيشتقواًمنهًوًأن يشتركواً‬ ‫جميعاًفيًتصميمًواحدًوًلكنًلكلًواحدًمنهمًطريقاًماًفيًالتطبيقًوًالعمل‪.‬‬


‫الصنفًالمجردً‪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‬‬ ‫}‬


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

‫‪3‬‬

‫‪2‬‬

‫‪Inherited Methods‬‬

‫‪Overridden Methods‬‬

‫أن يرث الصنف االبن دوال‬ ‫من االب كاملة كما هي دون‬ ‫تغيير أو تعديل و في هذه‬ ‫الحالة يمكن استدعاء هذه‬ ‫الدالة باستخدام كائنات من‬ ‫االب و االبن و في كال‬ ‫الحالتين يتم استدعاء تنفيذ‬ ‫الدالة من االب‬

‫أن يتم عمل ‪Override‬‬ ‫لدوال االب فيتم اعادة كتابة‬ ‫دالة االب بذات االسم و القيم‬ ‫الممررة و لكن يتم تغيير‬ ‫طريقة العمل و بالتالي عند‬ ‫استدعاء هذه الدالة باستخدام‬ ‫كائن من االبن فيتم استدعاء‬ ‫الدالة من االبن ال من االب‬

‫‪1‬‬ ‫‪New Methods‬‬ ‫أن يتم إنشاء دوال جديدة‬ ‫مستقلة عن دوال االب و هذه‬ ‫الدوال ال تستدعى إال من‬ ‫خالل كائنات االبن و احفاده و‬ ‫ال تستدعى من خالل كائنات‬ ‫االب‬


‫تدريبً‪: 1‬بناءًمجموعةًأصنافًلتمثيلًالموظف‬ ‫✓ مستخدمـاًمفاهيمً​ًالوراثةًوًتعددًاألشكالً‪ ,‬قمًببناءًأصنافًعنًالموظفًحسبً‬ ‫طريقةًحصولهًعلىًمستحقاتهً‪...‬‬


‫تدريبً‪: 1‬رسمًتوضيحيًلهيكليةًاألصناف‬ ‫‪Indirect Concrete‬‬ ‫‪Subclass class‬‬

‫‪Concrete‬‬ ‫‪Subclass class‬‬

‫موظفًبراتبً‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبالعمولة‬ ‫موظفًبراتب‬

‫موظفًبالساعة‬

‫‪Abstract super‬‬ ‫‪class‬‬

‫الموظف‬


Abstract Superclass Employee ‫إنشاء‬ Abstract super class

‫الموظف‬

Concrete Subclass class

Indirect Concrete Subclass class

‫موظفًبالعمولة‬

ً‫موظفًبراتب‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبراتب‬

‫موظفًبالساعة‬


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


‫إنشاء ‪Abstract Superclass Employee‬‬

‫انتبه‪ :‬هذه هي الدالة‬ ‫المجردة (أي مجردة من‬ ‫التطبيق) و يتم تعريفها‬ ‫فقط من خالل التوقيع‬ ‫(نوعها‪ ,‬اسمها ‪ ,‬قيمها)‬ ‫و تذكر أن من دونها‬ ‫فإن هذا الصنف ال‬ ‫يعتبر مجرد!!‬


Concrete Subclass SalariedEmployeeً‫إنشاء‬ Abstract super class

‫الموظف‬

Concrete Subclass class

Indirect Concrete Subclass class

‫موظفًبالعمولة‬

ً‫موظفًبراتب‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبراتب‬

‫موظفًبالساعة‬


‫إنشاءً‪Concrete Subclass SalariedEmployee‬‬

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


‫إنشاءً‪Concrete Subclass SalariedEmployee‬‬ ‫هنا قمنا بعمل ‪ override‬للدالة ‪ earnings‬من خالل‬ ‫تغيير طريقة حساب المرتب بينما احتفظنا بتوقيع الدالة‬

‫هنا قمنا بعمل ‪ override‬للدالة ‪ info‬من خالل‬ ‫تغيير طريقة إرجاع البيانات و استدعينا أيضا دالة‬ ‫االب من خالل )(‪super.info‬‬


Concrete Subclass CommissionEmployee ‫إنشـاء‬

Abstract super class

‫الموظف‬

Concrete Subclass class

Indirect Concrete Subclass class

‫موظفًبالعمولة‬

ً‫موظفًبراتب‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبراتب‬

‫موظفًبالساعة‬


Concrete Subclass CommissionEmployee ‫إنشـاء‬


Concrete Subclass CommissionEmployee ‫إنشـاء‬


‫إنشـاء ‪Concrete Subclass HourlyEmployee‬‬ ‫‪Indirect Concrete‬‬ ‫‪Subclass class‬‬

‫‪Concrete‬‬ ‫‪Subclass class‬‬

‫موظفًبراتبً‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبالعمولة‬ ‫موظفًبراتب‬

‫موظفًبالساعة‬

‫تدريبًذاتيً‪1‬‬

‫أتركًإنشاءًهذاًالصنفًلكمًكتدريبًعلم َّ‬ ‫اًبأنًمرتبًهذاًالنوعًمنً‬ ‫الموظفينًيحسبًمنًخاللًعددًساعاتًالعملًمضروباًفيًأجرة‬ ‫الساعةًالواحدة‬

‫‪Abstract super‬‬ ‫‪class‬‬

‫الموظف‬


Indirect Concrete Subclass BasePlusCommissionEmployee ‫إنشـاء‬

Abstract super class

‫الموظف‬

Concrete Subclass class

Indirect Concrete Subclass class

‫موظفًبالعمولة‬

ً‫موظفًبراتب‬ ‫أسبوعيًوًبعمولة‬

‫موظفًبراتب‬

‫موظفًبالساعة‬


Indirect Concrete Subclass BasePlusCommissionEmployee ‫إنشـاء‬


‫إنشـاء ‪Indirect Concrete Subclass BasePlusCommissionEmployee‬‬ ‫هنا قمنا بعمل ‪ override‬للدالة ‪ earnings‬من خالل‬ ‫تغيير طريقة حساب المرتب فيصبح المرتب األساسي‬ ‫مجموعا له العمولة على كل البيع و التي يتم الحصول‬ ‫عليها مباشرة من االب‬


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.