"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > استخدام مرجع Superclass لكائن فئة فرعية

استخدام مرجع Superclass لكائن فئة فرعية

تم النشر بتاريخ 2024-11-19
تصفح:602

Using a Superclass Reference for a Subclass Object

فكر في سيناريو حيث نقوم بإنشاء فئة تسمى المستخدم ثم نقوم بإنشاء فئة فرعية تمتد للمستخدم تسمى الموظف .
عادةً، نقوم بإنشاء مثيل لـ User مع:

User user = new User();

هنا المستخدم هو نوع المستخدم المتغير، والمستخدم هو المتغير الذي يحمل مثيل الفئة، ويقوم المستخدم الجديد () بإنشاء مثيل جديد للمستخدم.
ببساطة، المستخدم هو مثيل للمستخدم.


ولكن ماذا لو كانت الفئة الفائقة المستخدم بحاجة إلى استخدام الأساليب المحددة في فئتها الفرعية الموظف؟ هل يمكن أن يحدث هذا؟
الإجابة المختصرة هي yes، ولكن فقط للطرق المتجاوزة (الطرق الموجودة في كل من الفئة الفائقة والفئة الفرعية). وهذا ما يتيح تعدد الأشكال.
نظرًا لأن العلاقة في الميراث هي علاقة "is-a"، فإن الموظف هو مستخدم. لذلك، لا شيء يمنع User من الاحتفاظ بمرجع إلى مثيل من فئته الفرعية Employee، طالما أنه نوع متوافق.

ويتم ذلك على النحو التالي:

User user = new Employee();

الآن، لنفترض أن فئة المستخدم لها طريقتان:

  1. getUserName()
  2. getUserSalary().

بينما تحتوي فئة الموظف على طريقة إضافية تسمى getEmployeeInformation() وتتجاوز طريقة getUserSalary().

ثم مع المستخدم المستخدم = الموظف الجديد ()؛:

  1. user.getUserName() سوف يعمل، كما هو محدد في فئة المستخدم.

  2. سيعمل
  3. user.getUserSalary() أيضًا، لكن الإخراج سيكون من طريقة getUserSalary() التي تم تجاوزها في فئة Employee، وليس من الفئة الموجودة في User . وهذا هو جوهر تعدد الأشكال.

  4. user.getEmployeeInformation() لن يعمل. سيؤدي ذلك إلى ظهور خطأ في الترجمة لأنه خاص بفئة Employee.

يحدث خطأ في الترجمة عندما يجد المترجم مشكلات مثل أخطاء في بناء الجملة، أو عدم تطابق النوع، أو انتهاكات أخرى تمنع التجميع الناجح للتعليمات البرمجية.

إذا حاولنا القيام بالعكس والإشارة إلى كائن فئة فرعية Employee مع مرجع فئة فائقة User، فلن يعمل بدون الإرسال اليدوي! يتطلب هذا اختيارًا صريحًا، حيث أن المستخدم ليس بالضرورة موظف.


البث مقابل. إسقاط

بعد شرح ذلك بطريقة بسيطة، بمثال بسيط، دعونا نركز على المصطلحات.

"مرجع الفئة الفائقة إلى كائن فئة فرعية" يُطلق عليه عادةً upcasting. ببساطة، upcasting هو كتابة كائن فرعي إلى كائن أصل، ويحدث ذلك ضمنيًا ( مما يعني أن المترجم يتعامل معه تلقائيًا، لذلك لا نحتاج إلى أي بناء جملة محدد). يبدو الأمر كما لو فعلنا User user = new member();.

ماذا عن البث السفلي؟

البث العكسي تمامًا للبث التصاعدي.

هل تذكر عندما قلنا أن إنشاء مرجع الموظف من مثيل المستخدم غير صالح؟ وهذا ما يسمى downcasting، ويجب أن يتم ذلك بشكل صريح باستخدام صيغة الإرسال. على الرغم من أن النقل إلى الأعلى آمن للغاية، إلا أن البث إلى الأعلى يسبب مخاطر. وهذا لا يعني أنه غير مفيد، ولكن يجب استخدامه بحذر.

لن أخوض في الكثير من التفاصيل حول البث الهابط نظرًا لأن هذه المقالة تركز على البث الهابط، ولكن النقطة الأساسية هي إظهار الفرق الرئيسي بين البث الهابط والبث الهابط.


وهذا التفاف! :)

بيان الافراج تم نشر هذه المقالة على: https://dev.to/khaledsalshibani/using-a-superclass-reference-for-a-subclass-object-22ga?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] للحذف هو - هي
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3