← العودة للمدونة نُشر: 16 نوفمبر 2025

شرح مشروع OOP

الفكرة كلها تتمحور حول الوراثة في البرمجة الكائنية (OOP). تخيل إن عندك كائنات كثيرة تشترك في صفات معينة، بدل ما تكرر نفس الكود بكل كائن، تسوي كلاس "أب" يحتوي على الخصائص المشتركة، والكلاسات الثانية ترث منه وتضيف اللي يخصها.

بعدها نقدر نخزن الكائنات كلها في مكان واحد مثل ArrayList، ونتعامل معها بشكل موحّد، لكن كل كائن يتصرف بطريقته الخاصة.

المشروع هو بناء "نظام إدارة جامعة" بسيط باستخدام الجافا. الفكرة هنا مو بس إننا نكتب كود وخلاص، لا، الهدف الأساسي هو إننا نطبق المفاهيم اللي درسناها ونشوف كيف الـ OOP يخلي الحياة أسهل وأنظم.

التركيز كله بيكون على تطبيق مفاهيم قوية مثل الوراثة (Inheritance) وتعدد الأشكال (Polymorphism)، بالإضافة طبعاً لـ التغليف (Encapsulation) والتجريد (Abstraction).

ببساطة، إحنا بنصمم نظام يقدر يدير معلومات الطلاب والموظفين في الجامعة. راح نبدأ بكلاس "أب" أساسي (Person)، وبعدها بننشئ كلاسات "أبناء" مثل Student و Employee ترث منه وتضيف خصائصها الخاصة. والأجمل؟ بنشوف كيف نقدر نخزن كل هالأنواع المختلفة في قائمة وحدة بس، وكل واحد منهم يتصرف بطريقته الخاصة لما نطلب منه يعرض تفاصيله.

1) فكرة الكلاس الأب (Parent Class)

نبدأ بكلاس عام يمثل فكرة أساسية، مثلاً "مركبة" (Vehicle). كل مركبة لها اسم وسرعة، وهذه الصفات كل الأنواع بتشترك فيها.

class Vehicle {
    protected String name;
    protected int speed;

    public Vehicle(String name, int speed) {
        this.name = name;
        this.speed = speed;
    }

    public void displayInfo() {
        System.out.println("Name: " + name + ", Speed: " + speed + " km/h");
    }
}
      

الشرح: Vehicle الكلاس هنا هو الأب. أي نوع مركبة بعد كذا مثل سيارة، دراجة، طيارة… يقدر يرث منه ويضيف صفاته الخاصة. استخدمنا protected عشان نخلي الأبناء يقدرون يستخدمون المتغيرات بسهولة.

2) كلاس يرث ويضيف خاصية جديدة (Car)

class Car extends Vehicle {
    private int doors;

    public Car(String name, int speed, int doors) {
        super(name, speed);
        this.doors = doors;
    }

    public void displayInfo() {
        super.displayInfo();
        System.out.println("Doors: " + doors);
    }
}
      

الشرح: Car استخدم extends Vehicle، يعني يرث منه كل الخصائص name و speed. أضفنا خاصية جديدة doors، وعدلنا طريقة عرض المعلومات بحيث تطبع الأبواب فوق معلومات الأب.

3) كلاس ثاني يرث من نفس الأب (Bike)

class Bike extends Vehicle {
    private boolean hasEngine;

    public Bike(String name, int speed, boolean hasEngine) {
        super(name, speed);
        this.hasEngine = hasEngine;
    }

    public void displayInfo() {
        super.displayInfo();
        System.out.println("Has Engine: " + hasEngine);
    }
}
      

الشرح: Bike يرث نفس الخصائص من Vehicle، لكنه يضيف خاصية مختلفة وهي هل فيها محرك ولا لا. كل كلاس له طريقته الخاصة في عرض المعلومات، وهذا يوضح قوة الـ Polymorphism.

4) الوراثة المتسلسلة (Multi-level Inheritance)

class ElectricCar extends Car {
    private int batteryLife;

    public ElectricCar(String name, int speed, int doors, int batteryLife) {
        super(name, speed, doors);
        this.batteryLife = batteryLife;
    }

    public void displayInfo() {
        super.displayInfo();
        System.out.println("Battery Life: " + batteryLife + " hours");
    }
}
      

الشرح: هنا صارت الوراثة على مرحلتين: ElectricCar ← Car ← Vehicle يعني ElectricCar ورث كل شيء من Car و Vehicle مع بعض، وزاد عليها ميزة البطارية.

5) تخزين الكائنات في ArrayList واحدة

ArrayList<Vehicle> vehicles = new ArrayList<>();

vehicles.add(new Car("Toyota", 180, 4));
vehicles.add(new Bike("Yamaha", 120, true));
vehicles.add(new ElectricCar("Tesla", 250, 4, 12));

for (Vehicle v : vehicles) {
    v.displayInfo();
    System.out.println("---------------");
}
      

الشرح: العناصر تختلف في النوع (Car, Bike, ElectricCar) لكنها كلها من نفس الأب Vehicle. فـ ArrayList من نوع Vehicle تقبلها كلها. لما نعرضهم، كل كائن ينفذ displayInfo الخاصة فيه — وهنا تظهر قوة تعدد الأشكال Polymorphism.

6) مثال على التحقق من المدخلات

Scanner sc = new Scanner(System.in);
int speed;

while (true) {
    System.out.print("Enter vehicle speed: ");
    speed = sc.nextInt();
    if (speed >= 0) break;
    System.out.println("Invalid speed! It must be positive.");
}
      

الشرح: مثال بسيط يوضح كيف نتحقق من صحة القيم قبل ما نكمل. مثل مشروع الجامعة: - ما ينفع طالب درجته 200 - وما ينفع موظف راتبه بالسالب

7) فكرة المنيو العامة

int choice;
do {
    System.out.println("1. Add Vehicle");
    System.out.println("2. Show All Vehicles");
    System.out.println("3. Exit");
    System.out.print("Enter choice: ");
    choice = sc.nextInt();

    switch (choice) {
        case 1:
            // إضافة مركبة
            break;
        case 2:
            // عرض المركبات
            break;
        case 3:
            System.out.println("Exiting program...");
            break;
        default:
            System.out.println("Invalid choice, try again.");
    }
} while (choice != 3);
      

المنيو تخلي المستخدم يتفاعل مع البرنامج بطريقة بسيطة. نفس فكرتها بالضبط في مشروع الجامعة (إضافة طالب – عرض – حذف – خروج).

📺 مصادر تعلم

الخلاصة

هذا المشروع ما يختبر قدرتك على كتابة 5 كلاسات… يختبر إذا تعرف تبني “عائلة” مترابطة من الكلاسات. الفائدة الحقيقية هي قابلية التوسع (Scalability). لو طلبوا منك غدًا تضيف نوع جديد مثل Visiting Professor، ما يحتاج تعيد المشروع… بس تنشئ كلاس جديد يرث من Employee أو Person وهذا هو جوهر الكود النظيف والمستدام.