الأصناف والكائنات – المراجع والتغليف والوراثة

علوم الحاسوبالخوارزميات وحل المشكلات17–18 سنة

جارٍ التحميل…

استخدمها مع صفي ✨ خصّصها بالذكاء الاصطناعي الإبلاغ عن مشكلة

تتبّع خطوة بخطوة برامج قصيرة بلغة Python أو Java تعرّف أصنافًا وتنشئ كائنات وتستدعي توابع، وراقب عرض الذاكرة: تحمل المتغيرات في المكدس أسهمًا (مراجع) تشير إلى كائنات في الكومة، وبجانبها مخطط أصناف UML. تغطي ستة أمثلة الباني والحالة، والأسماء المستعارة وnull، وتمرير الكائنات إلى التوابع وإرجاعها منها، والتغليف بتوابع القراءة والتعيين، والوراثة مع إعادة التعريف وتعدد الأشكال، والأعضاء الساكنة. يتيح وضع التجربة أن تنشئ الكائنات وتنسخ المراجع بنفسك، وتطلب مهمة التصميم أن تبني مخطط أصناف من مواصفات مكتوبة.

الدرس: البرمجة كائنية التوجه: الأصناف والكائنات والمراجع والتغليف والوراثة وتعدد الأشكال

ماذا تعرض

الصنف مخطط يحدد الخصائص (البيانات) والتوابع (السلوك)، وكل كائن يُنشأ منه نسخة لها نسختها الخاصة من الخصائص. لا يحتوي متغير من نوع صنف على الكائن نفسه بل على مرجع إليه، لذلك فإن إسناد متغير إلى آخر ينشئ اسمًا مستعارًا، وقد يكون المرجع null (أو None في Python). يُبقي التغليف الخصائص خاصة ويتيح الوصول إليها عبر توابع تستطيع التحقق من القيم. يرث الصنف الفرعي أعضاء الصنف الأب ويمكنه إعادة تعريف توابعه؛ وأثناء التشغيل يحدد الصنف الفعلي للكائن أي نسخة من التابع تُنفَّذ، وهذا هو تعدد الأشكال.

طريقة الاستخدام

اختر «تتبّع الشيفرة» واللغة والمثال، ثم اضغط «خطوة» أو «تشغيل» وتابع السطر المميز والأسهم في عرض الذاكرة والتابع المميز في مخطط الأصناف. في «تجربة» أنشئ كائنات Account أو SavingsAccount، وانسخ المراجع بزر «إسناد» واستدعِ التوابع بزر «استدعاء» لترى الأسماء المستعارة والمهملات وإعادة التعريف. في «مهمة تصميم» اقرأ المواصفات، وانقر الأعضاء لنقلها إلى مربعات الأصناف، ثم اضغط «تحقق».

المعاملات القابلة للتغيير

  • الوضع تتبّع الشيفرة, تجربة, مهمة تصميم
  • المثال الأصناف والكائنات والتوابع, المراجع والأسماء المستعارة وnull, الكائنات معاملاتٍ وقيمًا مُرجعة, التغليف: توابع القراءة والتعيين, الوراثة وتعدد الأشكال, الأعضاء الساكنة (أعضاء الصنف)
  • اللغة Python, Java
  • سرعة التشغيل 0.5–5 خطوة/s
  • مهمة تصميم كتاب المكتبة, الأشكال (الوراثة), الطلاب (الأعضاء الساكنة)

أسئلة للاستكشاف

  1. بعد c2 = c1 ثم c2.increment()، لماذا تتغير قيمة c1.count أيضًا؟
  2. لماذا لا يغيّر reset(p) متغير المستدعي، بينما يغيّر move_right(p, dx) كائن المستدعي؟
  3. في الحلقة على pets، لماذا يعطي p.describe() صوتًا مختلفًا للكائن Dog والكائن Cat؟