450 likes | 710 Views
C++ Programming. L12 . Inheritance. الصفوف Classes ـ review Composition :. يستخدم المصطلح Composition عندما يكون لدينا صف يحوي في الـ data member أغراض من صفوف أخرى . تدعى أيضاً بعلاقة has-a أي علاقة ملكية . أمثلة :
E N D
C++ Programming L12 . Inheritance
الصفوف Classes ـ review Composition: • يستخدم المصطلح Composition عندما يكون لدينا صف يحوي في الـdata member أغراض من صفوف أخرى . • تدعى أيضاً بعلاقة has-a أي علاقة ملكية . • أمثلة : • Car has a wheel فيكون لدينا صف Car يحوي بداخله غرض من الصف Wheel . • Person has a birthday فيكون لدينا صف Person بداخله غرض من الصف Date . • Room has a Table فيكون لدينا صف Room بداخله غرض من الصفTable .
الصفوف Classes ـ Inheritance الوراثة : • يستخدم المصطلح Inheritance عندما يكون لدينا صف يشترك مع صف آخر في العديد من الخصائص . • تدعى علاقة الوراثة بعلاقة is – a أي علاقة ماهية. • أمثلة : • Car is a Vehicle فيكون لدينا صف Car يرث بعض الخصائص من الصف Vehicle. • Student is a Personفيكون لدينا صف Student يرث بعض الخصائص من الصف Person . • Circle is a Shape فيكون لدينا صف Circle يرث بعض الخصائص من الصف Shape .
الصفوف Classes ـ Inheritance الوراثة : Laptop is a computer Pc is a computer
الصفوف Classes ـ Inheritance الوراثة : Student is a Human Employee is a Human
الصفوف Classes ـ Inheritance الوراثة : • تعتبر الوراثة Inheritance مبدأ أساسي من مبادئ الـبرمجة غرضية التوجه OOP. • حيث يتم الاستفادة من صفوف مبنية مسبقاً . • يتم إضافة خصائص جديدة على صفوف مبنية مسبقاً .
الصفوف Classes ـ Inheritance الوراثة : • نقوم بتسمية الصف ShapeبـBase class أو Parent class . • نقوم بتسمية الصف Circle بـDerived class أو Child class . • يكون الأب Base class حاوياً على الخصائص المشتركة بين الأبناء . • وبعدها يقوم كل ابن بإضافة خصائص جديدة له . • مثال آخر :Base Class Vehicle • Derived class Car , it’s small , have 4 wheels , …….. • Derived class Buss , it’s Big , have more than 4 wheels ,……
الصفوف Classes ـ Inheritance الوراثة : Quad is a Shape Direct Inheritance Square is a Shape Indirect Inheritance
الصفوف Classes ـ Inheritance الوراثة : Single Inheritance Multiple Inheritance
الصفوف Classes ـ Inheritance الوراثة : إن الـChild_class يملك جميع الـmembers الموجودة في الـBase_class ولكنه لا يستطيع الوصول إلى بعضها وذلك وفقاً للـaccess mode كما سنرى بعد قليل . إن Inheritance_Type هي نمط الوراثة وهي public , private , protected . الوضع الافتراضي إن لم يتم التصريح عنها بشكل ظاهري هو private .
الصفوف Classes ـ Inheritance الوراثة : في داخل الصف A يمكننا الوصول إلى الـmembers مهما كان access modifier لها public , private , protected . يمكن للتوابع الصديقة رؤيةالـmembers مهما كان access modifier لها public , private , protected . لا يمكننا رؤية الـprivate members أو protected members من خارج الصف .
الصفوف Classes ـ Inheritance الوراثة : الصف B يرث من الصف Aالـpublic , protected members وكأنها معرفة لديه . الصف الابن B لا يمكنه الوصول إلى الـprivate members للصف الأب A . الصف الابن B يستطيع الوصول إلى الـprotected members للصف الأب A . من خارج الصف B لا يمكن رؤية سوى الـpublic members .
الصفوف Classes ـ Inheritance الوراثة : من خارج الصف B لا يمكن رؤية سوى الـpublic members . نلاحظ أنه يمكننا الوصول إلى الـattribute x من خلال الغرض b . إذاً داخل الصف B يكون لدينا جميع الـpublic members , protected members للصف الأب . أما خارج الصف B عند إنشاء غرض من B فإنه لا يمكننا الوصول إلا إلى الـpublic members. التوابع الصديقة لا تتم وراثتها وإنما يتم وراثة data members والـ methods
الصفوف Classes ـ Inheritance الوراثة : لا يتغير شي في الصف A . لا يتغير شي في الصف B . أي أنه نفس الرؤية تبقى سائدة . ماذا يحصل في حال كان الـInheritance Type هو protected ماذا يحصل في حال كان الـInheritance Type هو private .. اكتشف بنفسك والذي يتغير هو فقط خارج الصف B عند إنشاء غرض من الصف B فإن هذا الأخير لا يمكنه رؤية سوى الـpublic members التي يملكها دون أن يستطيع الوصول إلى public members الموجودة عند والده . إن protected Inheritance type نادر الاستخدام . سوف نستخدم في أمثلتنا Inheritance_typeالـpublic دوماً .
الصفوف Classes ـ Inheritance الوراثة : • يتم رؤيتها من الصف الأب . • يتم رؤيته من الصف الابن . • يتم رؤيتها من الأصدقاء للصف الأب . • يتم رؤيتها من الأصدقاء للصف الابن . • يتم رؤيتها من خارج الصف الابن . • تمثل أعلى إمكانية للوصول . Public members In Base Class
الصفوف Classes ـ Inheritance الوراثة : • يتم رؤيتها من الصف الأب . • لا يتم رؤيتها من الصف الابن . • يتم رؤيتها من الأصدقاء للصف الأب . • لا يتم رؤيتها من الأصدقاء للصف الابن . • لا يتم رؤيتها من خارج الصف الابن . • تمثل أدنى إمكانية للوصول . Private members In Base Class
الصفوف Classes ـ Inheritance الوراثة : • يتم رؤيتها من الصف الأب . • يتم رؤيتها من الصف الابن . • يتم رؤيتها من الأصدقاء للصف الأب . • يتم رؤيتها من الأصدقاء للصف الابن . • لا يتم رؤيتها من خارج الصف الابن . • تمثل حل وسط بين الـpublic و private . Protected members In Base Class
الصفوف Classes ـ Inheritance الوراثة : • Constructor . • Destructor . • الـfriends . • الـstatic data members . • الـstatic member function. ليس كل شي تتم وراثته !! وهذه بعض الأشياء التي لا تتم وراثتها !
الصفوف Classes ـ Inheritance الوراثة : • نحن نعلم أنه عندما يرث الصف B من الصف A فإنه يرث الـmethod و الـdata members . Overloading & Overriding • لنفرض أننا قمنا بكتابة method جديد في الصف الابن وكان اسمه نفس اسم method في الصف الأب هنا نميز حالتين: • في حال تم تطابق الـArgument لهذا الـmethod مع الـmethod الموجود عند الأب فإن العملية تدعى عندها Overriding وهنا الـmethod الجديد يهيمن على method الأب . • أما في حال كان هناك اختلاف في الـArgument فإن العملية تدعى بـOverloading .
الصفوف Classes ـ Inheritance الوراثة : OverridingExample
الصفوف Classes ـ Inheritance الوراثة : Overriding • إذاً عندما نقوم بتعريف method في الابن مماثل لـ method عند الأب في الاسم والـ Argument فإن هذه العملية تدعى overriding وبالتالي فإن method الابن يهيمن على method الأب . • إذا اضطرينا للوصول إلى method الأب من الصف الابن فإنه يجب علينا استخدام :: • في خارج الصف الأب عند استدعاء هذا الـmethod من غرض من الصف الأب فإنه يستدعي method الأب بالطبع . • في خارج الصف الابن عند استدعاء هذا الـmethod من غرض من الصف الابن فإنه يستدعي method الابن لأن method الابن قام بالهيمنة على method الأب .
الصفوف Classes ـ Inheritance الوراثة : Overloading Example
الصفوف Classes ـ Inheritance الوراثة : Overloading • إذاً عندما نقوم بتعريف method في الابن مماثل لـ method عند الأب في الاسم مع الاختلاف في الـArgument فإن هذه العملية تدعى overloading . • إذا أردنا الوصول إلى method الأب من الصف الابن فإنه يجب علينا استخدام ::
الصفوف Classes ـ Inheritance الوراثة : Constructor & Destructor • نحن نعلم أنه يتم استدعاء الباني تلقائياً من أجل تهيئة الـdata members . • عند إنشاء غرض من الصف الابن فإنه ينبغي علينا تهيئة القيم الموجودة في الصف الاب وبالتالي ينبغي علينا استدعاء باني الصف الأب في باني الصف الابن . • وفقاً لذلك فإن باني الأب ينفذ أولاً ثم يليه باني الابن . • يتم الهدم بترتيب معاكس لترتيب الإنشاء . • آخر غرض تم إنشاءه هو أول غرض يموت .
الصفوف Classes ـ Inheritance الوراثة : Constructor قم بكتابة الـcode ثم أجري عملية Debug وشاهد كيف يقوم الـCompiler بتنفيذ التعليمات . • هنا قمنا باستدعاء باني الصف الأب في باني الصف الابن بشكل صريح وذلك باستخدام member initialization list. • إن لم نقم باستدعاء باني الأب في باني الابن في الـInitialization list فإن الـcompiler سوف يقوم باستدعاءه تلقائياً ولكن دون أن يقوم بتمرير القيم لباني الأب .
الصفوف Classes ـ Inheritance الوراثة : Constructor& Destructorexample
الصفوف Classes ـ Inheritance الوراثة : Constructor& Destructorexample الآن سنعيد نفس المثال ولكن دون استدعاء باني الأب في باني الابن ماذا سيتغير ؟
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance • ذكرنا سابقاً أنه يمكن أن يكون لدينا وراثة متعددة • أي يكون لدينا صف B يرث من الصف A1 والصف A2 . • جميع المفاهيم في الـSingle Inheritance تنطبق على الوراثة المتعددة Multiple Inheritance .
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance • انتبه إلى الـSyntax في الوراثة المتعددة . • ترتيب استدعاء بواني الآباء يتم وفقاً لكيفية ورودها في باني الابن في الـInitialization list . • يمكن الوراثة من أكثر من صف . • دائماً باني الابن يستدعى باني الأب . • يتم هدم الأغراض بشكل معاكس لترتيب إنشاءها أي آخر غرض تم إنشاءه هو أول غرض سيموت .
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance • لنفترض أن الصف B يرث من الصف A1 و الصف A2 . • لنفترض أن الصف A1 يحوي data member اسمه x ومصرح عنه أنه public . • لنفترض أن الصف A2 يحوي data member اسمه x ومصرح عنه أنه public . • الآن الصف B يملك متحولين x إحداهما ورثه من A1 والآخر ورثه من A2 . • يجب التعامل مع هذه الحالة بحذر . لاحظ المثال التالي :
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance Example1 يتم حل التضارب من خلال scope resolution operator .
الصفوف Classes ـ Inheritance الوراثة : Multiple Inheritance Example2 عندما يتم استدعاء member من غرض ابن فإنه يتم البحث عن هذا الـmember بدءاً من الصف الابن صعوداً للآباء .