| | #1 (permalink) | |
| مشرف سابق ![]() ![]()
| ![]() يسرني أن أقدم لكم هذه الدورة الطويلة بعض الشيء ، سيتم فيها بإذن الله شرح لما هي البرمجة غرضية التوجه أو ما يعرف بـ OOP ، وسيتم بإذن الله تعالى شرح لمواضيع عديدة ومتفرقة في هذا المجال ، من تلك الدروس التي سندرسها : ** مقدمة عامة تشمل المفاهيم الأساسية ومزايا البرمجة الشيئية . ** مستويات الحماية وإنشاء الأصناف واستدعاء الأعضاء ( البيانات والدوال ). ** مؤثر دقة الوصول ( :: ) Scope Resolution Operator ** دوال البناء والهدم . ** المؤشر الحسابي & الحجز الديناميكي للذاكرة باستخدام new & delete ** الكائنات والدوال الثابتة constant objects & constant Functions ** المؤشر ** الأعضاء الساكنة static datda member ** الدوال الصديقة friend functions ** الأصناف الصديقة Friend Classes ** الدوال الخطية Inline Functions. ** التحميل الزائد للدوال Function Overloading ** التحميل الزائد للمؤثرات Operator Overloading ** التحويل بين الأنواع Converting between types ** الوراثة | |
| | |
| | #2 (permalink) | |
| مشرف سابق ![]() ![]()
| البرنامج أو المترجم الذي سنعمل عليه هو Dev - c++ أنقر هنا لزيارة الصفحة الرئيسية للمترجم . ولتحميل البرنامج مباشرة .:: ![]() ** معنى البرمجة الشيئية :: oop هي عبارة عن أسلوب جديد من أساليب البرمجة حيث أصبحت وحدة بناء البرنامج هي الصنف class والذي يحوي على البيانات data والعمليات ( الدوال ) functions . ولها عدة مسميات منها ..:: 1- البرمجة غرضية التوجة . 2- البرمجة الكائنية الموجهة . ![]() * أسلوب البرمجة الشيئية :. عادة ما تكون البرامج من هذا الأسلوب معقدة بشكل كبير حيث تقسيم البرنامج إلى مجموعة من المهام الرئيسية ومن ثم تقسم إلى مهام فرعية على حسب درجة التعقيد للمهام الرئيسية لذلك فان البرمجة الهيكلية تنتهج النهج ( من الأعلى إلى الأسفل ) Top Down . ![]() * عيوب هذا الأسلوب : البرمجة الهيكلية .:: 1- صعوبة فصل البيانات على العمليات . 2- إعادة إنشاء الحلول وعدة إعادة استخدامها . ![]() * المفاهيم الأساسية للبرمجة الشيئية :. 1- الكائن Object : عبارة عن وحدة تحوي مجموعة من البيانات تسمي ( خصائص ) properties أو صفات ومعرفة عليها مجموعة من العمليات . مثال .:: كائن السيارة .: الخصائص : Model :Ferrari Color : Blue Year : 2005 العمليات ::. Start ' الانطلاق ' Stop ' التوقف ' Accelerate 'التسارع' ![]() 2- الصنف Class : الكائنات ذات الخصائص والأفعال المشتركة بحاجة لآن تجمع مع بعضها البعض حتى يمكن استخدامها في برنامج ما. وبالتالي فإن الصنف : عبارة عن مجموعة من الكائنات التي تشترك في الخصائص والعمليات .. مثلاً ..:: الطالب كائن >> الطلاب صنف . الموظف كائن >> الموظفين صنف . ![]() * مزايا البرمجة الشيئية :. Features of (opp) 1- التجريدabstraction : وهو عملية تحديد الخصائص والعمليات التي تنتمي لصنف معين وهي نوعان .:: أ- تجريد البيانات Data abstraction : وهي عملية التعرف على الخصائص المرتبطة بكائن معين . ب- تجريد العمليات Methods abstraction: وهو عملية تحديد العمليات والإجراءات دون ذكر شيء عن كيفية أدائها . 2- التغليف ( الكبسلة )Encapsulation : هي عملية تجميع كل الخصائص properties والطرق ( العمليات ) Methods في وحدة واحدة ( داخل غلاف واحد ) حيث لا يمكن الوصول إليها ( أي الخصائص والطرق ) إلا عن طريق الكائن . 3- إخفاء البيانات Data Hiding:. وهي ميزة ناتجة عن كبسلة البيانات وتعني إضافة مستوى حماية معين على البيانات حتى نمنع وصول الخطأ إليها . 4- الوراثة Inhertance:. وهي أن يرث صنف ما الخصائص والعمليات الموجودة في الصنف الآخر مما يساعد على إعادة الاستخدام للأصناف التي تم إنشاؤها من قبل المستخدم . . ![]() ** أمثلة لبعض الأصناف المشتقة والأساسية في الوراثة :.. ![]() 5- تعدد الأشكال ( الأوجه ) polymorfisme: تسمح ميزة تعدد الأشكال لنفس الدالة أن تتعرف بصورة مختلفة في أصناف مختلفة . ويمكن عمل ذلك بـ الوراثة مع تعدد الأشكال . واللغات التي تدعم أسلوب البرمجة الشيئية كثيرة نذكر منها .. C++ و java و C# و vb.net آخر تعديل lovely_roro يوم 01-05-2009 في 07:33 PM | |
| | |
| | #3 (permalink) | ||
| مشرف سابق ![]() ![]()
| الدرس الثاني :.. ![]() ** مستويات الحماية ( محددات الوصول للعضو ) .: هي عملية تحديد مدى التعامل مع الأعضاء ( البيانات والعمليات ) . هل هذه الأعضاء خاصة بالصنف المعرفة فيه ، أم يمكن استخدام نطاق الصنف وهي ثلاث مستويات .:: 1- مستوى الحماية الخاص private : وفيه يتم تعريف الأعضاء التي يتم استخدامها في الصنف ، ولا يمكن الوصول إليها من خارج الصنف . 2- مستوى الحماية المحمي protected : الأعضاء المعرفة في هذا المستوى تشبه الأعضاء الخاصة غير أنه يمكن توريثها إلى أي صنف آخر . 3- مستوى الحماية العام Public : وفيه يتم تعريف الأعضاء العامة التي يمكن الوصول إليها من خارج الصنف . ![]() * ملاحظات :. 1- دائماً تتبع محددات الوصول للعضو بنقطتين ( : ) مثلاً اقتباس:
2- يمكن أن تظهر عدة مرات وبأي ترتيب في تعريف الصنف . 3- يتم إعادة تعريف البيانات الأعضاء في مستوى الحماية الخاص Private لأن من مبادئ البرمجة الشيئية " إخفاء البيانات " . 4- يتم إعادة تعريف الدوال الأعضاء في مستوى الحماية العام لآن هذه الدوال يتم استدعاؤها من خلال البرنامج الرئيسي . 5- من الممكن أن يكون لدينا بيانات عامة وعمليات خاصة غير أن هذا الاستخدام غير شائع . ![]() آخر تعديل lovely_roro يوم 01-05-2009 في 07:49 PM | ||
| | |
| | #4 (permalink) | |||||
| مشرف سابق ![]() ![]()
| ** الأصناف Classes : ![]() تعريف الصنف : هو عبارة عن وحدة تحوي مجموعة من البيانات ( الخاصة والعامة )بالإضافة إلى تعريف الدوال ( العمليات ) حيث يطلق على الدوال المعرفة داخل الصنف بـ " أعضاء دالية " member Function . ![]() * الإعلان عن الصنف : ![]() أمثلة :. مثال 1: مثال على صنف الوقت .:: كود PHP: ![]() مثال 2 : مثال على صنف المستطيل :. كود PHP: بمجرد تعريف الصنف يمكن استخدامه كنوع جديد حيث يطلق عليه ( نوع معرّف من قبل المستخدم). ![]() ** تعريف الكائنات .:: يتم تعريف الكائنات في البرنامج الرئيسي وفقاً للصيغة التالية : كود PHP: حيث : class_name : اسم الصنف ( نفس اسم الصنف الذي كتبناه في بداية البرنامج ) object_name : اسم الكائن ، وهو اختياري ، يستخدم للوصول لعناصر الصنف . ![]() مثال.:: اقتباس:
وإذا أردنا أن نعرف أكثر من كائن بنفس الوقت ، نفس العملية السابقة ، فقط نفصل بين كل كائن والآخر باشارة الفاصلة ( , ) . والمثال التالي يوضح ما سبق .:: اقتباس:
![]() ** استدعاء الأعضاء :. أعضاء الصنف لا يمكن أن نصل إليها من خارج الصنف إلا عن طريق الكائنات ويتم ذلك بالصيغة التالية : اقتباس:
Object_name : اسم الكائن . member : اسم العضو الذي نريد الوصول إليه . مثال : إذا أردنا الوصول للدالة area() باستخدام الكائن rect نكتب الآتي : اقتباس:
![]() البرنامج الأول : نقوم بكتابة برنامج يقوم بحساب مساحة المستطيل ( باستخدام الأصناف ) .. كود PHP: شرح للبرنامج :. في البداية عرفنا متغيرات خاصة Private وهما x ,y وهنا ملاحظة وهي طالما أننا عرفنا ذلك في بداية الصنف ولم نحدد مستوى الحماية فإن مستوى الحماية الإفتراضي هو Private . بعد ذلك أنشأنا دالة باسم set_value بوسيطين في مستوى الحماية العام Public وظيفة هذه الدالة هي مساواة القيم التي يحددها المستخدم بالمتغيرات الخاصة ، أو بمعنى أخر وظيفتها الوصول للمتغيرات الخاصة x,y . بعد ذلك أنشأنا دالة area() وظيفتها إرجاع مساحة المستطيل وهي عملية حسابية الطول × العرض . ثم في الدالة الرئيسية main() قمنا في البداية في باشتقاق كائنين rect1 و rect2 بعد ذلك قمنا باستدعاء دالة set_value وحددنا قيم الوسائط .. ثم بعد ذلك استدعينا دالة حساب المساحة area() لكل من الكائنين rect1 , rect2 . ![]() ** البرنامج الثاني : برنامج يقوم بحساب مساحة ومحيط الدائرة ( مستخدماً الأصناف ) .:: كود PHP: نفس المثال السابق تقريباً من حيث الفكرة حيث :.. r = نصف القطر . area1=المساحة. c = المحيط . cir = دالة ايجاد المحيط . display= طباعة المساحة والمحيط . area= المساحة . ![]() آخر تعديل lovely_roro يوم 01-05-2009 في 08:01 PM | |||||
| | |
| | #5 (permalink) | |
| مشرف سابق ![]() ![]()
| مؤثر دقة الوصول Scope Resolution Operator عبارة عن مؤثر يستخدم عندما تكتب تفاصيل الدالة العضو خارج الصنف . ** الصيغة العامة للدالة التي تكتب خارج الصنف هي : كود PHP: ![]() ** دوال البناء والهدم :: أولا: دوال البناء Constructor Function .::: هي عبارة عن دالة تحمل نفس اسم الصنف ويتم استدعاؤها مباشرة عند اشتقاق كائن من الصنف وتستخدم غالباً لإعطاء خصائص ( متغيرات ) الصنف قيم ابتدائية . ![]() - ملاحظات : 1- لا يمكن تهيئة البيانات العضو أثناء التعريف . 2- لا يوجد مردود ( return ) لدوال البناء . 3- يمكن أن يحوي الصنف أكثر من دالة بناء ( التحميل الزائد للدوال ). ![]() ** مثال توضيحي لمؤثر دقة الوصول ودوال البناء .: كود PHP: كود PHP: آخر تعديل lovely_roro يوم 01-05-2009 في 08:10 PM | |
| | |
| | #6 (permalink) | |
| مشرف سابق ![]() ![]()
| [U** المؤشر الحسابي :[/U] عند الحديث عن مؤشر الكائن يظهر مفهوم جديد وهو المؤشر الحسابي ونقصد به : أن مؤشر الكائن ربّما يخضع لبعض العمليات مثل : 1- ( ++ ) وتعني زيادة قيمة المؤشر Increment وتستخدم لجعل المؤشر يشير إلى الموقع التالي.. 2- ( -- ) وتعني إنقاص المؤشر Decrement وتستخدم لجعل المؤشر يشير إلى الموقع السابق . مثال : كود PHP: في هذا المثال لدينا مصفوفة من الكائنات كما يظهر في الكود : كود PHP: ولدينا المؤشر للعنصر الأول : كود PHP: اذا فنحن نستطيع التنقل الى الكائنات الأخرى من خلال Pointer Arithmatic وهو في حالتنا هذه x++ أي أذهب الى الكائن الأخر في المصفوفه وهكذا إلى ان يصل للكائن الأخير وستكون المخرجات بالشكل التالي :.. 1 2 3 4 5 6 7 8 ( المثال من تعديل وتوضيح استاذنا الفاضل romansy ) ![]() الحجز الديناميكي للذاكرة باستخدام new & delete : في لغة c++ نستخدم المؤشر new لحجز الذاكرة الديناميكية و delete لإلغائها . - الصيغة العامة لحجز ذاكرة وإلغائها لكائن واحد هي :. كود PHP: أما في حالة عدة مواقع فإننا نستخدم الصيغة التالية :. كود PHP: ![]() مثال على حجز موقع واحد وإلغائه .:::( لابد أن تكون مطلع على موضوع المؤشرات والمراجع ) كود PHP: كما هو الواضح مثال يقوم بطباعة حاصل ضرب عددين باستخدام الدالة get_Product() ، حيث تم حجز موقع واحد فقط في الذاكرة . أما عن حجز عدة مواقع فنقوم بتعديل طفيف على المثال السابق بحيث يظهر كما في الشكل التالي: كود PHP: وهذاالمثال كما ذكرت نفس المثال السابق ولكن لعدة مواقع بحيث في البداية يتم ادخال رقم ( مثلاُ 7 ) ومن يقوم بطباعة حاصل ضرب الأعداد في نفسها من 1 إلى 6 ( 1*1 ، 2*2 ، ... ، 6*6) وتظهر المخرجات كما في الشكل التالي: ![]() ![]() الاعلان عن دالة بناء ( لان اسمها من اسم الصنف ) ولاحظ اننا وضعنا في نهاية تعريف الدالة فاصلة منقوطة ( ; ) وهذه نضعها في حال لم نريد كتابة تفاصيل الدالة داخل الصنف كود PHP: لاحظ اننا كتبنا هذا الكود بعد اقفال الكلاس . لكتابة تفاصيل الدالة خارج الصنف نستخدم هذه الطريقة بحيث في البداية كتبنا اسم الصنف myclass ومن ثم مؤثر دقة الوصول وهو ( show التي سترد الان ) . كود PHP: لاحظ هنا في البداية نكتب نوع الدالة DataType وهو Void الموجود في دالة show ، ومن ثم اسم الصنف ومؤثر دقة الوصول واسم الدالة ( كما في الدالة السابقة) ![]() | |
| | |
| | #7 (permalink) | |
| مشرف سابق ![]() ![]()
| ** دالة الهدمDestructor Function هي عبارة عن دالة عضو في الصنف ، ويتشكل اسمها من المحرف ( ~ ) مضافاً إليه اسم الصنف . وتستخدم لإنهاء الأعمال الداخلية للكائنات حتى يستطيع النظام استعادة الذاكرة لحفظ كائنات جديدة . ملاحظات على دالة الهدم : 1- ليس لها وسائط ، ولا ترجع فيمة . 2- يمكن للصنف أن يحتوي على دالة هدم واحدة فقط . 3- لا يمكن تحميل دالة الهدم بشكل زائد. ![]() ** استخدام الوساط ( التلقائية ) الإفتراضية مع دالة : يمكن أن يستخدم أي نوع أو أي عدد من المعاملات ( الوسائط) داخل دالة البناء ، في هذه الحالة يتم استدعاء دالة البناء للكائنات ذات المعاملات التي تتناسب مع عدد المعاملات الموجودة داخل دالة البناء . مثال .: كود PHP: توضيح بسيط لأهم ما ورد في هذا الكود : في البداية يطلب البرنامج من المستخدم ادخال عددين ليسجلهما في المتغيرين m,n .. و عند اشتقاق الكائن الأول وهو ob1 كما يظهر هنا ::. كود PHP: كود PHP: أي يجعل قيمة x و y تساوي العدد ( 1 ) . ومن ثم استدعاء دالة الطباعة للكائن ob1 كما في هذا الشكل :.[/FON كود PHP: ]بعد ذلك تم اشتقاق كائن اخر من الصنف myclass باسم ob2 وله وسيطتين وهما العددين الذين ادخلهما المستخدم في بداية البرنامج .::[/FONT] كود PHP: ليتم بعدها طباعة العددين m,n من خلال دالة الطباعة display()[/FONT] ![]() ** متى تستدعى دوال البناء والهدم ؟! 1- يعتمد الترتيب الذي يستدعى به هذه الدوال على ترتيب الذي يدخل فيه التنفيذ أو يخرج من المجال الذي عرفت فيه الكائنات . 2- بشكل عام . يتم استدعاء دوال الهدم بترتيب معاكس لدوال البناء غير أنه يمكن أن يتغير هذا الترتيب في بعض الحالات ( ستذكر في السياق :smailes100: ) 3- تستدعى دوال البناء للكائنات المعرفة في المجال العام وقبل تنفيذ أي دالة بما فيها الدالة Main() . 4- تستدعى دوال الهدم المقابلة عندما تنتهي الدالة main(). 5- تستدعى دوال البناء للكائنات المحلية التلقائية عندما يصل التنفيذ إلى النقطه التي عرفت فيها الكائنات . 6- تستدعى دوال الهدم المقابلة عندما تغادر الكائنات المجال الذي عرفت فيه . 7- تستدعى دوال البناء للكائنات المحلية الساكنة عندما يصل التنفيذ إلى النقطة التي عرّفت فيها الكائنات وتستدعى دوال الهدم المقابلة عند انتهاء الدالة Main() . ![]() ** برنامج يوضح لك النقاط السابقة حتى تتضح الرؤية حول كيفية الاستدعاء :smailes94: كود PHP: توضيح بسيط للبرنامج :. في البداية يقوم بتنفيد دوال البناء لكل من ( 1 ، 2 ، 3 ) بعدها يقفز للأسفل لقراءة تفاصيل الدالة Create();فيقرأ كل من ( 5 ، 6 ، 7 ) وبعدها بعملية عكسية يتم الهدم "مثل ما ذكر سابقاً" فيتم الهدم لكل من ( 7 ) وبعدها لا يحدف (6) لانه ساكن Static فينتقل للتي بعدها وهي ( 5) فيتم هدمها وبعد ذلك يعود للبرنامج الرئيسي فيقوم بتنفيذ ( 4 ) ومن بعدها تنتهي الدالة Main() فيقوم البرنامج بالهدم بعملية عكسية أيضاً فيهدم ( 4 ) ومن ثم ( 2) " 3 لا يهدم لانه ساكن حاله حال 6 " ومن بعدها يهدم الدالة 2 .. الان يهدم وبعد الانتهاء من هدم الدوال العامة يعود لهدم الدوال الساكنة فيهدم ( 6 ) ومن بعدها يهدم الدالة رقم ( 3 ) .. وفي الأخير يتم هدم الدوال العامة ولا يوجد لدينا الا دالة واحده وهي ( 1 ) . آخر تعديل lovely_roro يوم 01-05-2009 في 11:05 PM | |
| | |
| | #8 (permalink) | |
| مشرف سابق ![]() ![]()
| ** دالة الهدمDestructor Function هي عبارة عن دالة عضو في الصنف ، ويتشكل اسمها من المحرف ( ~ ) مضافاً إليه اسم الصنف . وتستخدم لإنهاء الأعمال الداخلية للكائنات حتى يستطيع النظام استعادة الذاكرة لحفظ كائنات جديدة . ملاحظات على دالة الهدم : 1- ليس لها وسائط ، ولا ترجع فيمة . 2- يمكن للصنف أن يحتوي على دالة هدم واحدة فقط . 3- لا يمكن تحميل دالة الهدم بشكل زائد. ![]() ** استخدام الوساط ( التلقائية ) الإفتراضية مع دالة : يمكن أن يستخدم أي نوع أو أي عدد من المعاملات ( الوسائط) داخل دالة البناء ، في هذه الحالة يتم استدعاء دالة البناء للكائنات ذات المعاملات التي تتناسب مع عدد المعاملات الموجودة داخل دالة البناء . مثال .: كود PHP: توضيح بسيط لأهم ما ورد في هذا الكود : في البداية يطلب البرنامج من المستخدم ادخال عددين ليسجلهما في المتغيرين m,n .. و عند اشتقاق الكائن الأول وهو ob1 كما يظهر هنا ::. كود PHP: كود PHP: أي يجعل قيمة x و y تساوي العدد ( 1 ) . ومن ثم استدعاء دالة الطباعة للكائن ob1 كما في هذا الشكل :.[/FON كود PHP: ]بعد ذلك تم اشتقاق كائن اخر من الصنف myclass باسم ob2 وله وسيطتين وهما العددين الذين ادخلهما المستخدم في بداية البرنامج .::[/FONT] كود PHP: ليتم بعدها طباعة العددين m,n من خلال دالة الطباعة display()[/FONT] ![]() ** متى تستدعى دوال البناء والهدم ؟! 1- يعتمد الترتيب الذي يستدعى به هذه الدوال على ترتيب الذي يدخل فيه التنفيذ أو يخرج من المجال الذي عرفت فيه الكائنات . 2- بشكل عام . يتم استدعاء دوال الهدم بترتيب معاكس لدوال البناء غير أنه يمكن أن يتغير هذا الترتيب في بعض الحالات ( ستذكر في السياق :smailes100: ) 3- تستدعى دوال البناء للكائنات المعرفة في المجال العام وقبل تنفيذ أي دالة بما فيها الدالة Main() . 4- تستدعى دوال الهدم المقابلة عندما تنتهي الدالة main(). 5- تستدعى دوال البناء للكائنات المحلية التلقائية عندما يصل التنفيذ إلى النقطه التي عرفت فيها الكائنات . 6- تستدعى دوال الهدم المقابلة عندما تغادر الكائنات المجال الذي عرفت فيه . 7- تستدعى دوال البناء للكائنات المحلية الساكنة عندما يصل التنفيذ إلى النقطة التي عرّفت فيها الكائنات وتستدعى دوال الهدم المقابلة عند انتهاء الدالة Main() . ![]() ** برنامج يوضح لك النقاط السابقة حتى تتضح الرؤية حول كيفية الاستدعاء :smailes94: كود PHP: توضيح بسيط للبرنامج :. في البداية يقوم بتنفيد دوال البناء لكل من ( 1 ، 2 ، 3 ) بعدها يقفز للأسفل لقراءة تفاصيل الدالة Create();فيقرأ كل من ( 5 ، 6 ، 7 ) وبعدها بعملية عكسية يتم الهدم "مثل ما ذكر سابقاً" فيتم الهدم لكل من ( 7 ) وبعدها لا يحدف (6) لانه ساكن Static فينتقل للتي بعدها وهي ( 5) فيتم هدمها وبعد ذلك يعود للبرنامج الرئيسي فيقوم بتنفيذ ( 4 ) ومن بعدها تنتهي الدالة Main() فيقوم البرنامج بالهدم بعملية عكسية أيضاً فيهدم ( 4 ) ومن ثم ( 2) " 3 لا يهدم لانه ساكن حاله حال 6 " ومن بعدها يهدم الدالة 2 .. الان يهدم وبعد الانتهاء من هدم الدوال العامة يعود لهدم الدوال الساكنة فيهدم ( 6 ) ومن بعدها يهدم الدالة رقم ( 3 ) .. وفي الأخير يتم هدم الدوال العامة ولا يوجد لدينا الا دالة واحده وهي ( 1 ) . آخر تعديل lovely_roro يوم 01-05-2009 في 10:31 PM | |
| | |
| | #9 (permalink) | |
| مشرف سابق ![]() ![]()
| مساواة الكائنات : يمكن مساواة كائن بكائن أخر مثلاً إذا كان لدينا كائنين A و B إذا جعلنا ( A=B ) فهذه العملية تعني نسخ محتويات الكائن B بالكائن A . ملاحظات : 1- يجب أن تكون الكائنات من نفس النوع وإلا أدى ذلك إلى خطأ . 2- يمكن إرسال الكائن كوسيطة للدالة ، كما يمكن إرجاعه من الدالة . ![]() مثال : كود PHP: كما هو ظاهر في هذا المثال وهو خاص بطباعة التاريخ ، قمنا في البداية بتعريف دالة بناء افتراضية ذات ثلاثة معاملات وهي اليوم والشهر والسنة ، ومن ثم قمنا بتعريف دالة للطباعة . قمنا بعدها باشتقاق كائنين الأول date1 قمنا من خلاله بإرسال المعاملات أو الوسائط وهي اليوم والشهر والسنة(7,4,1993) ، والكائن الثاني date بدون وسائط ( بحيث ينفذ الوسائط التلقائية الموجودة في دالة البناء وهي 1-1-1990) بعدها قمنا بطباعة محتويات الكائن الأول وهي 7-4-1993ومن ثم طباعة محتويات الكائن الثاني وهي 1-1-1990 بعد ذلك قمنا بنسخ محتويات الكائن date1 بالكائن date2 كما يظهر في هذا الكود كود PHP: بعد ذلك قمنا بطباعة محتويات الكائن الثاني لتظهر لنا 7-4-1993 . | |
| | |
| | #10 (permalink) | |
| مشرف سابق ![]() ![]()
| ** إرسال الكائن إلى دالة تسمح لغة C++ بإرسال الكائنات إلى الدوال كما يتم إرسال المعاملات البسيطة ، ويمكن توضيح ذلك في المثال التالي: كود PHP: توضيح مبسط لأهم ما ورد في الكود السابق : كما يتضح من خلال هذا البرنامج البسيط والذي يقوم بطباعة حاصل ضرب العدد بنفسه . ظهر في هذا المثال الدالة التالية : كود PHP: الدالة sqr_i له وسيطة واحدة وهي الكائن ob المشتق من الصنف sample ،حيث يتم من خلال هذا الكائن الوصول للدوال الموجودة داخل الصنف sample فكما ظهر قمنابالوصول للدالة get_i() والتي وظيفتها الوصول للمتغيرات الموجودة في مستوى الحماية الخاص Private . بعد ذلك قمنا باشتقاق كائنين s1 الذي يرسل القيمة ( 2 ) لدالة البناء sample بعد ذلك يتم طباعة حاصل العدد (2) في نفسه من خلال الدالة sqr_i التي تستقبل وسيطة واحدة وهي الكائن s1 . وكذا الحال مع الكائن الاخر s2 . آخر تعديل lovely_roro يوم 02-05-2009 في 01:47 AM | |
| | |
| | #11 (permalink) | |
| مشرف سابق ![]() ![]()
| ** الكائنات الثابتة والدوال الثابتة على حسب حاجة البرنامج قد تكون لدينا كائنات غير قابلة للتعديل والبعض الآخر قابل للتعديل ، لجعل الكائن غير قابل للتعديل نستخدم الكلمة المفتاحية Const مثلاً كود PHP: ملاحظات : 1- لا تسمح مترجمات لغة C++ لأي دالة عضو باستدعاء كائنات ثابتة مالم يصرح عن الدوال العضو نفسها كدوال ثابتة. 2- دوال العضو المصرح عنها كدوال ثابتة لا يمكن أن نعدل على الكائن حيث لا يسمح المترجم بذلك . 3- يتم الإعلان عن الدالة الثابتة باستخدام الكلمة المفتاحية const في تعريفها وعند كتابة التفاصيل مثلاً : كود PHP: OR كود PHP: 4- استدعاء دالة عضو غير ثابتة non const على كائن ثابت تعتبر خطأ قواعدياً . مثال :[/ كود PHP: مثال بسيط جداً بحيث جعلنا المتغير incre متغير ثابت const بحيث تكون قيمته ثابتة ، ومتغير اخر باسم count ومن قم في كل مرة يضيف قيمة المتغير incre إلى المتغير count ويطبع قيمة المتغيرين ، وستظهر المخرجات بهذا الشكل :: ![]() نقطه هامة جداً بخصوص الدالة increment . لاحظ اننا كتبناها بهذه الصيغة ( لاحظ المتغير incre ) كود PHP: في الأصل المفروض كما ورد في امثلة سابقة ان تكون بهذه الصيغة كود PHP: لكن في المتغيرات الثابتة const فاننا لا نعرفها بهذا الشكل ... اانتظرووني لبقية الدرس ان شاااء الله ... دمتم بخيير ... آخر تعديل lovely_roro يوم 02-05-2009 في 02:04 AM | |
| | |
| | #12 (permalink) | |
| مشرف سابق ![]() ![]()
| ** الدوال الصديقة والأصناف الصديقة Friend Classes & Friend Functions تعريف الدالة الصديقة : هي عبارة عن دالة تفاصيلها خارج الـ Class مع امتيازها بحق الوصول لجميع أعضاء الـ Class . - للتصريح عن الدالة الصديقة نستخدم الكلمة المفتاحية friend كما يلي : كود PHP: OR كود PHP: ملاحظات : 1- مع أن تعريف الدالة الصديقة يتم داخل الصنف ، إلا أنها لا تعتبر دالة عضو من أعضاء الصنف ، لذلك من الخطأ استدعاؤها باستخدام اسم الكائن مع أداة الوصول ( . ) . 2- لا تؤثر مستويات الحماية على التصريح عن الدالة الصديقة لذلك يمكن التصريح عن الدالة الصديقة في أي موضع داخل الصنف . 3- الدالة الصديقة لها امتيازات الدالة العضو في الصنف ، أي أنها لها المقدرة على الوصول إلى جميع خصائص الصنف . 4- يتم استدعاء الدالة الصديقة عن طريق اسمها مع الوسائط . ![]() * مثال : برنامج يتم فيه التصريح عن الدالة الصديقة setx والتي تستخدم في الوصول إلى عضو البيانات الخاص x . كود PHP: هذا المثال بسيط جداً يوضح آلية التعامل مع الدوال الصديقة بحيث يتم في البداية تعريف الدالة في أي موقع داخل الـ Class كما في الشكل التالي : كود PHP: كما يظهر الدالة تحتوي على وسيطة Parameter مرجع لكائن والأخرى متغير ، وطريقة كتابة التفاصيل خارج الـ Class كما ظهر في هذا الشكل : كود PHP: كما ظهر فانه تم الوصول للمتغير x الموجود في مستوى الحماية private مباشرة ومن ثم تخزين القيمة الموجودة في المتغير val في المتغير x .. بعد ذلك : كود PHP: كما ظهر في البداية يستدعي دالة البناء count والتي تجعل قيمة المتغير x تساوي القيمة 0 ومن ثم طباعة هذه القيمة . بعد ذلك يتم التعامل مع الدالة setx بحيث نغير قيمة المتغير x بجعلها تساوي الرقم 8 ومن ثم طباعتها ... هذا باختصار فكرة عمل هذا البرنامج .. ![]() مثال2 : برنامج يستخدم دالة صديقة تقارن بين نصفي قطري دائرتين ( إيجاد المساحة والمحيط لكل دائرة ) : كود PHP: | |
| | |
| | #13 (permalink) | |
| مشرف سابق ![]() ![]()
| ** الأصناف الصديقة Friend Classes تعريف : هو عبارة عن صنف تستطيع كل دواله الأعضاء أن تستخدم خصائص الصنف الآخر . - وللتصريح عن الصنف الصديق : نستخدم الكلمة المفتاحية friend مثلاً لجعل الصنف tow صديق للصنف one نكتب العبارة التالية : كود PHP: داخل الصنف one . ملاحظات : 1- يمكن التصريح عن الصنف الصديق بأي موضع داخل الآخر . 2- علاقة الصداقة ليست تناظرية ، بمعنى إذا كان الصنف A صديق للصنف B فهذا لا يعني أن الصنف B صديق للصنف A . 3- علاقة الصداقة ليست متعدية ، بمعنى إذا كان الصنف A صديق للصنف B والصنف B صديق للصنف C فهذا لا يعني أن الصنف A صديق للصنف C . مثال توضيحي : كود PHP: هذه الصيغة العامة للتعامل مع الأصناف الصديقة . تنبيه : الصنف الصديق لابد أن يعرف أولا .. ** مثال : برنامج يستخدم الأصناف الصديقة ، ويقوم بإيجاد الوسط الحسابي لـ N من الأعداد الحقيقية المدخلة من قبل المستخدم .بحيث * الصنف الأول يستخدم لـ ( إدخال الأعداد ثم اثجاد مجموعها والذي نسميه بـ summation ). * الصنف الثاني يستخدم المعلومات الموجودة في الصنف الأول summation ومن ثم إيجاد الوسط الحسابي والذي نسميه بـ mean ::.. كود PHP: آخر تعديل lovely_roro يوم 02-05-2009 في 07:54 PM | |
| | |
| | #14 (permalink) | |
| الصـ والغرائب ــور ![]() ![]()
| ![]() بصراحة واااصح جداً انك بذلتي جٌهد للقيام بهذا الموضوع شكراً لكِ أختي الغالية لوفلي رورو على الطرح المميز و في انتظار كل جديدك بكل شوق مع تحياتي العطرة: barboosh ![]() ألا بذكر الله تطمئن القلوب : ; : ; barboosh
| |
| | |
| | #16 (permalink) | |
| مشرف سابق ![]() ![]()
| ** أعضاء الصنف الساكنة Static Class members البيانات الساكنة : هي عبارة عن خصائص ( متغيرات ) مشتركة بين كل كائنات الصنف ، أي أن كل الكائنات لها نفس النسخة من المتغيرات . - وللتصريح عن البيانات الساكنة نستخدم المفتاحية static . ![]() * ملاحظات : 1- لابد من تهيئة المتغيرات الساكنة لمرة واحدة فقط في البرنامج . 2-يمكن الوصول للمتغيرات الساكنة العامة باستخدام اسم الصنف مع مؤثر دقة الوصولScope Resolution Operator ( :: ) ، أو باستخدام اسم الكائنات . مثلاً : ليكن لدينا الصنف Employee والذي يحمل المتغير الصحيح العام count لتهيئة هذا المتغير نكتب العبارة التالية : كود PHP: وللوصول لهذا المتغير في البرنامج الرئيسي نتبع أحد هاتين الطريقتين : كود PHP: OR كود PHP: حيث s كائن تم اشتقاقه من الصنف Employee . 3- أي دالة تعامل مع بيانات ( متغيرات ) ساكنة لابد أن تكون ساكنة أيضاً . مثلاً كود PHP: حيث count هو متغير ساكن والذي سبق تعريفة في الملاحظة السابقة . 4- استدعاء الدالة الساكنة يتم باستخدام : أ. مؤثر دقة الوصول Scope Resolution Operator . ب. الكائنات . ![]() مثال على البيانات الساكنة كود PHP: كماهو ملاحظ لدنيا المتغير الساكن وهو n تم تعريفه في بداية الصنف : كود PHP: ومن ثم لدينا دالة البناء التي تزيد قيمة المتغير n بالعدد ( 1 ) من خلال مؤثر التزايد كما يظهر :. كود PHP: بعد ذلك تم تطبيق أمر مهم جداً (ملاحظة رقم 1) وهو تهئية قيمة المتغير وهنا في هذا المثال جعلنا n=3 وتم التعريف خارج الصنف باستخدام مؤثر دقة الوصول Scope Resolution Operator : كود PHP: بعد ذلك تم اشتقاق أربعة كائنات من الصنف staticproperty : كود PHP: لاحظ هنا دالة البناء تزيد قيمة المتغيرn بـ ( 1) وتم تهيئة قيمة المتغير بالعدد ( 3) فعند اشتقاق اي كائن تزيد قيمة n باضافة العدد 1 إلي القيمة السابقة . فعند اشتقاق الكائن s1 أصبحت قيمة n تساوي العدد 4 . وعند اشتقاق الكائن s2 أصبحت قيمةn تساوي العدد 5 . وعند اشتقاق الكائن s6 أصبحت قيمةn تساوي العدد 6 . وعند اشتقاق الكائن s7 أصبحت قيمةn تساوي العدد 7 . وكما ذكرنا في التعريف الموجود في اول الرد اقتباس: البيانات الساكنة : هي عبارة عن خصائص ( متغيرات ) مشتركة بين كل كائنات الصنف ، أي أن كل الكائنات لها نفس النسخة من المتغيرات . أي ان : كود PHP: وجميع الكائنات تساوي اخر عملية تمت على اي كائن وهي اشتقاق الكائن s4 زادت قيمة المتغير n وأصبحت تساوي العدد 7 .. أي عند طباعة أي كائن :. كود PHP: فستكون مخرجات هذا البرنامج هي :: 7 7 ![]() مثال (2) على الأعضاء ( الدوال ) الساكنة : كود PHP: وهنا تم تعريف دالة display() على انها دالة ساكنة ::. كود PHP: ومن ثم تم تهيئة قيمة المتغير n بالعدد ( 2 ) : كود PHP: بعدها تم اشتقاق الكائنات من الصنف property :: كود PHP: ونفس العملية في المثال الأول تتم هنا أيضاً .. حيث ان جميع الكائنات تحتوي على المتغير n الذي يساوي العدد ( 5 ) . بعد ذلك تمت طباعة المخرجات بطرق مختلفة كما هو ظاهر ::. كود PHP: حيث في هذه الحالة تكون المخرجات بـ : 5 5 5 ![]() تمرين : وضح مخرجات هذا البرنامج ( دون استخدام اي مترجم ) كود PHP: | |
| | |
| | #17 (permalink) | |
| مشرف سابق ![]() ![]()
| ** استخدام المؤشر This كل كائن يملك حق الوصول إلى عنوانه عن طريق مؤشر يدعى This . يُستخدم المؤشر This بشكل ضمني ليشير أن الأعضاء تنتمي إلى كائن معين ، ويمكن استخدام المؤشر This بشكل صريح . ![]() كود PHP: ملاحظات : 1- تم استخدام الدالة print() لطباعة قيمة المتغير x بشكل مباشر ، ثم بعد ذلك استخدمنا ترميزين مختلفين لطباعة x : أ. معامل السهم ( -> ) مع المؤشر This . ب. معامل النقطة ( . ) مع محتوى المؤشر ( *This ). 2- تم استخدام الأقواس مع محتوى المؤشر This ( *This ) ، لأن عامل النقطة له أولوية أعلى على عامل المحتوى ( * ) . 3- إذا لم يتم استخدام الأقواس مع محتوى المؤشر ( *This ) بحيث نضعها بهذا الشكل : كود PHP: فإنه يحدث خطأ قواعدي لأننا استخدمنا عامل النقطة مع المؤشر This . ** وهنالك استخدام آخر ومهم جداً للمؤشر This وهو تفعيل الاستدعاء المتتالي للدوال ** ![]() مثال : يبين هذا البرنامج إرجاع مرجع لكائن الصنف sample لتفعيل الاستدعاء المتتالي للدوال . كود PHP: هذا البرنامج طويل بعض الشيء .. سنشرح ماهو مهم .. ::: كود PHP: هذا تعريف الدالة cube وهي لايجاد تكعيب أي عدد مدخل ( نوع الدالة مرجع كائن). كود PHP: وهذا هو كتابة تفاصيل الدالة كتبناها خارج الصنف حيث ان كل القيم من الدالة تمثل محتوى المؤشر This . بعد ذلك والأهم وهو طريقة الاستدعاء المتتالي للدوال وهو كما ظهر في الدالة الرئيسية main().: كود PHP: فكما هو ملاحظ تم اشتقاق الكائن s من الصنف sample ومن ثم تم استدعاء الدالتين cube والدالة show بشكل متتالي .. | |
| | |
| | #18 (permalink) | |
| مشرف سابق ![]() ![]()
| ** التحميل الزائد للدوال Function Overloading : وهو إمكانية إنشاء أكثر من دالة تحمل نفس الاسم ولكنها قد تختلف في نوعية المعاملات Parameters Types أو في عدد المعاملات Parameters No ، ولكل دالة الإجراء الخاص بها . أي أن الدوال تشترك في اسمها ولكنها تختلف في شكلها ومضمونها . ![]() مثال : برنامج يقوم بإجراء عملية الجمع باستخدام محمّلة بشكل زائد . كود PHP: كما ظهر في هذا المثال لدينا ثلاثة دوال تحمل نفس الاسم : كود PHP: تظهر الدالةالأولى والثانية ان عدد الوسائط Parameters متساوي ولكنها تختلف في النوع حيث أن الأولى int والثانية float . اما الدالة الثالثة فهي تختلف عنهم من حيث عدد الوسائط Parameters . هذا باختصار عن ما يسمى بـ Function Overloading . | |
| | |
| | #19 (permalink) | |
| مشرف سابق ![]() ![]()
| ** التحميل الزائد للمؤثرات Operator Overloading :: هو المقدرة على ربط مؤثر معين لدالة عضو في الصنف ويتم استدعاؤها عند تطبيق المؤثر على أحد كائنات الصنف . * فائدته : مؤثر الجمع ( + ) نستطيع أن نقوم بتطبيقه على عددين صحيحين أو حقيقيين ولكن لا نستطيع استخدامه مع الكائنات إلا بعد ت حميله تحميلاً زائداً ملاحظات : 1- لا ينبغي تغيير وظيفة المؤثر عند تحميله . مثلاً إذا قمنا بتحميل مؤثر الجمع فلا ينبغي استخدامه مع عملية أخرى مثل ( - , * , / ) ، لأن هذا الاستخدام يعتبر استخدام سيء لمفهوم التحميل الزائد للمؤثرات ويجعل من الصعب فهمه . 2- يمكن تحميل معظم المؤثرات الموجودة في لغة C++ بشكل زائد . 3-نستخدم الكلمة المفتاحية Operator عند القيام بتحميل مؤثر تحميلاً زائداً . - والصيغة العامة لدالة التحميل الزائد للمؤثرات : كود PHP: حيث : datatype = القيمة الراجعة من الدالة ( كائن ) . operator = وهي كلمة مفتاحية Keyword . operatorSymbol = وهو رمز المؤثر ( + , * , ...) ![]() - المؤثرات التي يمكن تحميلها بشكل زائد في C++ وهي : كود PHP: - المؤثرات التي لا يمكن تحميلها بشكل زائد : كود PHP: * تعتبر محاولة تحميل أي مؤثر لا يمكن تحميله بشكل زائد خطأ قواعدي . * تحميل مؤثري الجمع والإسناد ( + , = ) لجعل هذه الجملة صحيحة كود PHP: لا نستطيع أن نقوم بكتابة الجملة أعلاه بالشكل التالي : كود PHP: إلا بعد تحميل المؤثر += بشكل صريح ![]() * مثال : على تحميل مؤثر التزايد ( ++ ) كود PHP: هذا المثال يبين كيفية التعامل مع مؤثر التزايد ( ++ ) مع الكائنات بحيث تم تعريف الدالة التحميل الزائد داخل الصنف بالشكل التالي : كود PHP: وكما يظهر أن الدالة لا تحتوي على أي وسائط Parameters ، وبالعادة دائما ما تكون مؤثرات التزايد والتناقص ( ++ , -- ) بدون وسائط ، ويظهر أن الدالة أيضاً ترجع كائن ، وتم كتابة تفاصيل الدالة خارج الصنف باستخدام مؤثر دقة الوصول Scope Resolution Operator كما بالشكل التالي : كود PHP: وسيتم شرح طرق كتابة دالة التحميل الزائد بعد توضيح مخرجات هذا البرنامج . كود PHP: ملاحظة : مؤثر الإسناد ( = ) يعرّف إذا كان لدينا حجز ديناميكي للذاكرة . ![]() # يمكن لدالة التحميل الزائد أن ترجع كائن بثلاث طرق 1- استخدام مؤثر This : كود PHP: 2- باستخدام كائن مؤقت Temporary Object : كود PHP: 3- باستخدام كائن من غير اسم Name Less Object كود PHP: هذه الطرق الثلاثة التي بالإمكان استخدامها مع مؤثري التزايد والتناقص ( ++ , -- ) ولكن مع مراعاة تغيير الإشارات بين المؤثرين . ![]() ** تحميل المؤثرات الثنائية ( + , - , * , / , ^ , % ) : يتم تحميل المؤثرات الثنائية باستخدام دالة عضو ذات وسيطة واحدة أو باستخدام دالة غير عضو في الصنف مثلاً ( دالة صديقة ) بوسيطتين . * مثال على تحميل مؤثر الجمع لإجراء عملية الجمع على كائنين باستخدام دالة تحميل عضو : كود PHP: ويمكن أن تكون دالة التحميل الزائد دالة غير عضو كما ذُكر سابقاً ( مثلاً دالة صديقة Friend Function )وفي هذه الحالة يتم تعريفها داخل الصنف بالشكل التالي : كود PHP: وتفاصيلها تكتب خارج الصنف بالشكل التالي : كود PHP: وفي البرنامج الرئيسي يمكن أن نغير add3 إلى كود PHP: ![]() ** تحميل المؤثرات المركبة (+= , -= , *= , /= , ^= , %= ) ذكرنا بأن تحميل أي مؤثر ثنائي مثل مؤثر الجمع لا يؤدي إلى تحميل المؤثرات المرتبطة به كـ ( += ) وبالتالي أي مؤثر مركب حتى نستطيع استخدامه مع الكائنات لابد من تحميله بشكل صريح . * مثال يوضح طريقة تحميل المؤثر المركب += كود PHP: ![]() ** تحميل مؤثرات المقارنة ( == , != , > , < , <= , >= ) القيمة الراجعة من دالة التحميل الزائد لمؤثرات المقارنة هي عبارة عن قيمة منطقية boolean . مثال على تحميل مؤثر (>) كود PHP: كما يظهر في هذا المثال يتم المقارنة بين الكائنين c1 و c2 ومن ثم طباعة القيمة الأكبر بينهما ... وهذا باختصار عن ما يسمى بالتحميل الزائد للمؤثرات Operator Overloading . آخر تعديل lovely_roro يوم 03-05-2009 في 04:11 PM | |
| | |
| | #21 (permalink) | |
| مشرف سابق ![]() ![]()
| ** الوراثة Inheritance تعريف الوراثة : هي إمكانية أن يرث صنف ما الخصائص والعمليات الموجودة في صنف آخر ، مما يساعد على إعادة استخدام Reusability الأصناف التي تم إنشاؤها من قبل . وبناء على هذا التعريف فإنه يمكن تحديد مفهومين جديدين وهما : 1- صنف القاعدة ( الأساس Or الموروث ) base class : وهو الصنف الذي يحوي البيانات والعمليات المراد توريثها لصنف آخر . 2- الصنف المشتق ( الوارث ) Derived class : وهو الصنف الوارث لخصائص وعمليات الصنف الأساس . ![]() # أنواع الوراثة Inheritance Types : توفر لغة C++ ثلاث أنواع من الوراثة حيث يحدد نوع الوراثة درجة الوصول للبيانات والعمليات الموجودة في صنف الأساس من خلال الصنف المشتق . والأنواع هي : 1- الوراثة الخاصة private Inheritance : عندما يرث صنف مشتق صنف الأساس وكان نوع الوراثة خاص فإنه كل البيانات والعمليات الموجودة في صنف الأساس تصبح خاصة الصنف المشتق . 2-الوراثة المحمية protected Inheritance : وفي هذا النوع تصبح كل بيانات وعمليات صنف الأساس محميّة بالصنف المشتق . 3- الوراثة العامة public Inheritance : في هذا النوع يتم توزيع البيانات والعمليات كما يلي : أ- المحمي protected في صنف الأساس base class يصبح محمي في الصنف المشتق . ب- العام public في صنف الأساس يصبح عام في الصنف المشتق . ج- الخاص لا يورّث أبدا ( البيانات الخاصة لا تورّث أبداً )! .. ويمكن توضيح ما سبق من خلال هذا الجدول :. [/CENTER]تشكل الوراثة هيكل هرمي حيث يمثل صنف الأساس قمة الهرم فمثلاً .:: ![]() - الصيغة العامة للوراثة : لجعل الصنف derived يرث الصنف Base : كود PHP: كود PHP: فكما يظهر في هذا المثال البسيط الذي يضرب عددين مدخلين من قبل المستخدم ، في هذا المثال لدينا صنفين ( Class B, Class D ) ، وأن الصنف D يرث وراثة عامة Public من الصنف B كما ظهر في الشكل التالي :. كود PHP: كود PHP: فكما يظهر لدينا الدالة get_i() الموجودة في الصنف B تم التعامل معها هنا في الصنف D بدون أي إضافات . ![]() * دوال البناء والهدم تحت الوراثة Constructor And Destructor Functions Under Inheritance : إن كلاً من الصنف الوارث والصنف الموروث يمكن أن يمتلكا دوال بناء ودوال هدم . # ملاحظات : 1- دالة بناء الصنف الموروث تنفذ قبل دالة بناء الصنف الوارث . 2- دالة هدم الصنف الوارث تنفذ قبل دالة هدم الصنف الموروث . 3- لا يمكن توريث دوال البناء والهدم من الصنف الأساس إلى الصنف المشتق . 4- يتم إرسال المعاملات لدالة بناء الصنف الموروث من خلال دالة بناء الصنف الوارث باستخدام مهيء العضو ( : ) . مثال : يوضح هذا البرنامج كيفية استدعاء دوال البناء والهدم للصنف الأساس والصنف المشتق . كود PHP: كما يظهر في هذا المثال لدينا دالة البناء Point والصنف circle الذي يرث من الصنف Point وراثة عامة Public كما يظهر في الشكل التالي : كود PHP: كود PHP: أول شيء لدينا الكائن P في مجال معين ( بين أقواس ) كود PHP: في هذه الحالة يقوم باستدعاء دالة البناء point ومن ثم دالة الهدم مباشرة قبل الخروج من هذا المجال بحيث تكون المخرجات بالشكل التالي :. كود PHP: كود PHP: بعد ذلك لدينا اشتقاق للكائن circle1 ، وكما ذكرنا سابقاً في الملاحظات ( ملاحظة رقم 1) ، حيث يتم في البداية تنفيذ دالة البناء point أولاً ومن ثم دالة البناء لـ circle ، وكذا الحال مع الكائن circle2 بحيث تكون المخرجات بالشكل التالي :. كود PHP: كود PHP: بعد ذلك يتم استدعاء دوال هدم الصنف الوارث قبل الصنف الموروث بترتيب معاكس بحيث الناتج النهائي للبرنامج بكامل مخرجاته ستكون على النحو التالي ::.. كود PHP: ![]() * الوراثة المتعددة Multiple Inheritance : تسمح لغة C++ لصنف ما أن يرث أكثر من صنف ، وهذا النوع من التوارث يتحقق بطريقتين : 1- الصنف الوارث يمكن أن يُستخدم كـصنف موروث من قبل صنف وارث آخر ويمكن توضيح ذلك بالهرمية التالية : ![]() 2- الصنف الوارث يمكن أن يرث أكثر من صنف موروث . والصيغة العامة للتوارث في هذه الحالة هي : كود PHP: ويمكن تمثيلها كما يظهر في الشكل التالي :. ![]() # ملاحظات : 1- في حالة وراثة عدّة أصناف موروثة فإن دوال البناء يتم تنفيذها من اليسار إلى اليمين والعكس بالنسبة لدوال الهدم : ![]() 2- يتم إرسال المعاملات لدالة بناء الصنف الموروث ( الأصناف الموروثة ) من خلال دالة بناء الصنف الوارث . مثال : على التوارث المتعدد ( الطريقة رقم 2 من الصورة السابقة ) : كود PHP: في هذا المثال ستكون هرمية التوارث : كود PHP: 1 2 3 سيكون الناتج أيضاً كما هو في المدخلات : 1 2 3 وهذا المثال آخر على الطريقة الثانية ( الشكل رقم 1 من الصورة السابقة ) كود PHP: وهذا المثال يوضح كيفية استدعاء دوال البناء والهدم في حال وجود عدّة أصناف موروثة : كود PHP: يجب التنويه بنقطة ذكرناها سابقاً وهي عند يتم أولاً تنفيذ دوال البناء كلها قبل تنفيذ أي دالة هدم قبل الخروج من المجال المحدد ، وسبق شرح هذه النقطة سابقاً ، وستكون مخرجات هذا البرنامج بالشكل التالي ::. كود PHP: ![]() * الصنف الموروث الوهمي Virtual Base Class : في حالة الوراثة المباشرة لعدة أصناف قد تحدث بعض المشاكل ولفهمها نناقش الهرمية التالية للتوارث : ![]() في هذه الحالة يتم توارث الصنف base1 مرتين في الصنف derived3 مرتين ، مرة من خلال dervied1 ومرة أخرى من خلال الصنف dervied2 . مما يؤدي إلى ازدواجية عند الوصول أو إرسال المعاملات إلى أعضاء الصنف base1 وفي هذه الحالة يظهر الاستفسار التالي : - هل يتم إرسال المعاملات إلى الصنف base1 عن طريق derived1 أو عن طريق derived2 ؟ ولحل هذه المشكلة "الازدواجية" توجد في لغة C++ آلية تعمل على إيجاد نسخة واحدة من الصنف الوارث derived3 في الصنف الموروث base1 وهذه الآلية تعرف بالصنف الموروث الوهمي . * مثال على الصنف الموروث الوهمي : كود PHP: ويلاحظ في هذا الكود هو إضافة الكلمة المفتاحية Virtual في كل من ::.. كود PHP: كود PHP: ![]() ![]() واخيراا ...اتمنى ان يكون الدرس مفييد ... واستفاد منه الجميع .. دمتم جميعا بود ... | |
| | |
![]() |
| Bookmarks |
| أدوات الموضوع | |
|
|
مواضيع ذات صلة | ||||
| الموضوع | الكاتب | المجلس | المشاركات | المشاركة الأخيرة |
| لن انساك حبيبي | mariam08 | الخواطر والشعر الفصيح | 21 | 28-02-2006 04:27 AM |
| الحب : دردشة الحب : شات الحب : منتدى الحب : صور الحب : العاب الحب :دليل الحب : دردشة خليجية : دردشة شات الحب |