Professional Documents
Culture Documents
Mymethod Child Mymethod Father: Namespace Class
Mymethod Child Mymethod Father: Namespace Class
namespace oop_6
{
class Animal
{
2 بسمة سراقبي.م
جامعة ادلب
كلية الهندسة المعلوماتية
السنة الثانية -مادة برمجة متقدمة 1
نفّذ البرنامج السابق لتحصل على الخرج التالي:
الحظ كيف يُعبّر ك ّل كائن من األصناف األبناء عن التابع Moveبالشكل الذي يناسبه .وواضح ّ
أن
التابع Moveالموجود في الصنف األب Animalال يُستدعى مطل ًقا .ولكن في بعض الحاالت قد نرغب
تجاوز الموجود في الصنف األب إلنجاز بعض المهام ومن ث ّم نتابع العمل ضمن التابع
أن يُستدعى التابع ال ُم َ
ال ُمتجا ِوز .يمكننا ذلك ببساطة من خًّلل استخدام الكلمة المحجوزة baseالتي تُشير إلى الصنف األب الذي
يرث منه االبن .الستدعاء التابع Moveالموجود في الصنف األب Animalوذلك من خًّلل
التابع Moveالموجود في الصنف Frogأضف العبارة التالية بعد سطر التصريح عن التابع Move
مباشرة ً قبل أي عبارة أخرى ،ليصبح هذا التابع على الشكل:
}
سنتناول في هذه الفقرة سلو ًكا قد يبدو غريبًا بعض الشيء ،ولكنّه مهم وأساس ّ
ي وسيصادفك في معظم البرامج
التي تكتبها باستخدام سي شارب .أعد البرنامج oop_6إلى حالته األصلية (أي أزل
العبارة () .)base.Moveامسح محتويات التابع Mainواستبدلها بالشيفرة التالية:
أن الكائن الذي يشير إليه المتغيّر animalهو كائن من ي كفاية لكي يعرف ّ يبدو ّ
أن برنامجنا ذك ّ
الصنف . Frogفي الحقيقة يحصل هنا تحويل ضمني بين الكائنات ،ولكن إذا فعلنا العكس ،أي أسندنا
مرجع لكائن من الصنف Animalإلى متغيّر من النوع Frogفسنحصل على خطأ أثناء ترجمة
البرنامج .امسح محتويات التابع Mainواستبدلها بالشيفرة التالية:
}
ي من النوع Animalإلى النوع Frogويقترح علينا يخبرنا هذا الخطأ أنّه ال يمكن التحويل بشكل ضمن ّ
أن المتغيّر animalيحمل مرجع استخدام عامل التحويل بين األنواع ( castingهل تذكره؟) .رغم ّ
األول من الشيفرة السابقة) ّإال أنّنا عند محاولتنا
الكائن من الصنف Frogفي حقيقة األمر (انظر السطر ّ
إسناد المتغيّر animalإلى المتغيّر frogحصلنا على خطأ .السبب في ذلك هو أنّه ال يحدث تحويل
ي بين األنواع implicit conversionوإنّما يتطلّب األمر إجراء تحويل صريح باستخدام عامل
ضمن ّ
التحويل بين األنواع .إذا استبدلت السطر الثاني من الشيفرة السابقة بالسطر التالي ،ستكون األمور على ما
يرام:
}
الحظ كيف وضعنا عامل التحويل ( )Frogأمام المتغيّر .animalسيضمن ذلك حدوث التحويل
ي مشاكل.
المطلوب دون أ ّ
ي ومتى يجب استخدام التحويل الصريح ،تذ ّكر منّي لكي تريح نفسك من التفكير متى يحدث التحويل الضمن ّ
ّ
ولكن العكس ليس صحي ًحا". كثيرا ما يحتوي األب ابنه،
القاعدة التالية" :في حياتنا اليوميّةً ،
أن لهذه القاعدة شواذ في واقعنا ،ولكنّها في البرمجة ال تخيب! فالمتغيّر من النوع األب يستطيع استقبال
أعلم ّ
ولكن العكس ليس صحيح ما لم نستخدم التحويل الصريح بين األنواع. ّ أي مرجع لكائن من صنف ابن،
;int i = 6
;double d = i
;double d = 6
;int i = d
فسنحصل على نفس الخطأ السابق الذي يخبرنا بوجوب استخدام التحويل الصريح بين األنواع .يمكن حل
هذه المشكلة ببساطة باستخدام عامل التحويل ( )intووضعه أمام المتغيّر dفي السطر الثاني:
;double d = 6
;int i = (int)d
نخبر المترجم هنا أنّنا نريد التحويل فعلياا من doubleإلى .intستحتاج إلى مثل هذه التقنيّة دو ًما إذا
كانت عمليّة التحويل ستؤدّي إلى ضياع في البيانات .فالتحويل من doubleإلى intسيؤدّي إلى ضياع
القيمة على يمين الفاصلة العشريّة ّ
ألن المتغيّرات من النوع intال تقبلها .وكذلك األمر عند التحويل
ألن المتغيّرات من النوع floatذات د ّقة أقل من المتغيّرات من من floatإلى ّ double
النوع ،doubleوهكذا.
تمارين داعمة
تمرين 1
الخالصة