يستخدم املصطلح Composition عندما يكون لدينا صف يحوي في الـ data member أغراض من صفوف أخرى . تدعى أيضا بعالقة has-a أي.

Download Report

Transcript يستخدم املصطلح Composition عندما يكون لدينا صف يحوي في الـ data member أغراض من صفوف أخرى . تدعى أيضا بعالقة has-a أي.

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