Object-Oriented
Programming Assignment
ثلاثة أسئلة تُغطّي أعمق مفاهيم البرمجة كائنية التوجه — Composition، Inheritance، Polymorphism، Abstraction، و Interfaces
Object-Oriented Thinking — Composition & Association
Objective: Design a system that emphasizes object collaboration and data encapsulation using Composition and Association, without relying on inheritance or interfaces.
في هذا السؤال، المطلوب تصميم نظام حجز رحلات جوية (Flight Reservation System) يُدير العلاقة بين الرحلات والركاب والطيارين من خلال تعاون الكائنات مع بعضها. يعتمد النظام على مفهومَي Composition (حيث تمتلك الرحلة قائمتها الخاصة من الركاب) وAssociation (حيث تُربط كل رحلة بطيار واحد من الخارج). لا يُستخدم الوراثة أو الواجهات في هذا السؤال.
-
ثلاثة حقول:
Stringname،StringpassportNumber، وdoublebaggageWeightلتمثيل اسم الراكب ورقم جواز سفره ووزن أمتعته. - مُنشئ (Constructor) يُهيّئ الحقول الثلاثة دفعةً واحدة عند إنشاء الكائن.
- دوال getter مناسبة للوصول إلى كل حقل من الخارج مع الحفاظ على مبدأ التغليف (Encapsulation).
-
ثلاثة حقول:
Stringname،StringlicenseID، وintexperienceHoursلتمثيل هوية الطيار وخبرته. - مُنشئ يُهيّئ جميع الحقول عند إنشاء الكائن.
- دالة لعرض بيانات اعتماد الطيار (Pilot Credentials) تطبع اسمه ورقم رخصته وساعات خبرته.
-
Composition: تحتضن الرحلة قائمتها الخاصة
ArrayList<التي تُنشأ داخلياً — لا تُمرَّر من الخارج.Passenger> -
Association: تُربط كل رحلة بكائن
Pilotواحد يُمرَّر من الخارج ولا تمتلكه الرحلة بشكل حصري. -
حقول:
StringflightNumber،Stringdestination، وfinal intMAX_CAPACITYلتحديد رقم الرحلة ووجهتها وحدها الأقصى من الركاب. -
addPassenger(Passengerp) — تُضيف راكباً إلى القائمة فقط إذا لم تبلغ الرحلة طاقتها القصوى. -
calculateTotalBaggage() — تجمع أوزان أمتعة جميع الركاب وتُعيد الإجمالي. -
printManifest() — تطبع تفاصيل الرحلة، بيانات الطيار، وقائمة كاملة بأسماء الركاب.
Inheritance & Polymorphism — Dynamic Systems
Objective: Implement a financial account hierarchy to demonstrate the use of Inheritance, Method Overriding, and Dynamic Binding.
يتمحور هذا السؤال حول بناء هرمية حسابات بنكية تُظهر قوة
الوراثة والتعدد الشكلي. كل نوع حساب يرث سلوكاً مشتركاً من
كلاس أساسي Account، ثم يُعيد تعريف سلوك السحب بطريقة تتناسب مع طبيعته.
يُختبر التعدد الشكلي عبر دالة audit التي تعمل على مصفوفة من الأنواع المختلفة
وتستدعي الدالة الصحيحة تلقائياً في وقت التشغيل (Dynamic Binding).
-
حقلان:
intidوdoublebalanceيُمثّلان رقم الحساب ورصيده الحالي. -
withdraw(doubleamount) — دالة السحب الافتراضية المراد تجاوزها في الكلاسات الفرعية. -
deposit(doubleamount) — تُضيف المبلغ إلى الرصيد مباشرةً دون قيود. -
toString() — تُعيد تمثيلاً نصياً للحساب يتضمن المعرّف والرصيد.
-
يرث جميع حقول ودوال
Accountدون إضافة حقول جديدة. -
يُعيد تعريف
withdraw: يمنع العملية كلياً إذا كان المبلغ المطلوب أكبر من الرصيد الحالي، لضمان عدم سلبية الرصيد في أي وقت.
-
حقل إضافي
doubleoverdraftLimitيحدد الحد الأقصى المسموح به للسحب فوق الرصيد الصفري. -
يُعيد تعريف
withdraw: يُجيز العملية طالما أن الرصيد بعد السحب لا يتخطى حد السحب على المكشوف (أي:balance - amount ≥ -overdraftLimit).
-
دالة
static voidaudit(Account[] accounts) تتلقى مصفوفة من الحسابات المختلطة الأنواع. -
تتكرر على المصفوفة وتستدعي
withdrawلكل عنصر — يتكفّل الـ Dynamic Binding تلقائياً باستدعاء الإصدار الصحيح حسب النوع الفعلي للكائن. -
تستخدم عامل
instanceofللكشف عن كائناتCheckingAccountوطباعة قيمةoverdraftLimitالخاصة بها تحديداً.
Abstraction & Interfaces — The Geometric System
Objective: Build a system for managing geometric shapes using Abstract Classes, Interfaces (Comparable, Cloneable, and custom), and Deep Cloning.
يستهدف هذا السؤال بناء نظام إدارة أشكال هندسية يعتمد على ثلاثة طبقات: كلاس مجرد يُعرّف السلوك المشترك، واجهات تُضيف قدرات إضافية (التلوين، المقارنة، النسخ العميق)، وكلاس ملموس يُجمع كل شيء. يتجلّى مبدأ Abstraction في إخفاء التفاصيل الهندسية خلف عقود واضحة تُحدّدها الواجهات.
-
حقلان خاصان:
privateStringcolorوbooleanfilledلتمثيل لون الشكل وحالة ملئه. -
دالتان مجردتان:
getArea() وgetPerimeter() تُجبر كل كلاس فرعي على توفير تنفيذه الخاص للمساحة والمحيط. -
ينفّذ
Comparable<GeometricObject> — يُقارن الكائنات بناءً على مساحتها المحسوبة، ما يُتيح الترتيب التلقائي.
-
واجهة بسيطة تحتوي على دالة واحدة:
voidhowToColor() تُلزم الكلاسات المنفّذة بتوضيح كيفية تلوين الشكل.
-
يمتد من
GeometricObjectوينفّذ كلاً منColorableوCloneable. -
حقل خاص واحد:
private doublesideيمثّل طول ضلع المربع. -
يُعيد تعريف
getArea() لتُعيدside * side، وgetPerimeter() لتُعيد4 * side. -
ينفّذ
howToColor() لطباعة:"Color all four sides." -
يُعيد تعريف
clone() لإجراء نسخ عميق (Deep Copy) — يُنشئ كائناً جديداً مستقلاً تماماً بدلاً من مجرد نسخ المرجع.
-
sortShapes(ArrayList<GeometricObject> list) — ترتّب قائمة الأشكال تصاعدياً وفق ترتيبها الطبيعي (المساحة) مستعينةً بـComparableالمُنفَّذ في الكلاس الأساسي. -
sumArea(GeometricObject[] list) — تُكرّر على مصفوفة الأشكال وتُعيد مجموع مساحاتها الكلي.