ل محاضرة : 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من خالل تغيير طريقة حساب المرتب فيصبح المرتب األساسي مجموعا له العمولة على كل البيع و التي يتم الحصول عليها مباشرة من االب