Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الكلمة المفتاحية super

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 21 من 87.

توفر الكلمة المفتاحية super طريقة للفئة الفرعية (subclass) للإشارة إلى فئتها الأصلية (parent class). وهي ضرورية عندما تحتاج إلى الوصول إلى أعضاء الفئة الأصلية أو المشيدات (constructors) من داخل فئة تابعة (child class).

الاستخدام الأكثر شيوعاً لـ super هو استدعاء منشئ الفئة الأب (constructor). يجب أن يكون هذا هو البيان الأول في منشئ الفئة الفرعية:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
    
    public String getBrand() {
        return brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // يجب أن يكون السطر الأول
        this.doors = doors;
    }
}

يمكنك أيضاً استخدام super لاستدعاء دوال الفئة الأب، وهو أمر مفيد بشكل خاص عندما تحتوي الفئة الفرعية على دالة بنفس الاسم:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // يستدعي نسخة Animal
        System.out.println("Meow!");
    }
}

فكر في super على أنها عكس this. بينما تشير this إلى الكائن الحالي، تشير super إلى جزء الفئة الأب (parent class) من ذلك الكائن. يصبح هذا التمييز حاسمًا عند بناء التسلسلات الهرمية للفئات حيث تحتاج الفئات التابعة (child classes) إلى توسيع سلوك الفئة الأب بدلاً من استبداله بالكامل.

challenge icon

التحدي

سهل

لنقم ببناء نظام أجهزة منزلية يوضح كيف يمكن للفئات التابعة (child classes) استخدام super لاستدعاء منشئات الفئة الأم (parent constructors) وتوسيع سلوك دوال الفئة الأم.

ستقوم بإنشاء ثلاثة ملفات لتنظيم الكود الخاص بك:

  • Appliance.java: أنشئ الفئة الأم التي تمثل أي جهاز منزلي. يجب أن تحتوي على:
    • حقل خاص (private field) لعلامة الجهاز التجارية brand (String)
    • حقل خاص لـ wattage (int)
    • منشئ (constructor) يقبل كلتا القيمتين ويقوم بتهيئتهما
    • دالة getBrand() تعيد العلامة التجارية
    • دالة getWattage() تعيد القدرة الكهربائية (wattage)
    • دالة getInfo() تعيد: [brand] - [wattage]W
  • WashingMachine.java: أنشئ فئة فرعية (subclass) ترث من Appliance. تمتلك الغسالة كل ما يمتلكه الجهاز المنزلي، بالإضافة إلى ميزاتها الخاصة:
    • حقل خاص لـ capacity (int) يمثل سعة التحميل بالكيلوجرام
    • منشئ يأخذ brand و wattage و capacity - استخدم super(brand, wattage) لتهيئة جزء الفئة الأم، ثم قم بتعيين السعة
    • دالة getCapacity() تعيد السعة
    • دالة getInfo() تستدعي getInfo() الخاصة بالفئة الأم باستخدام super.getInfo() وتوسعها لتعيد: [parent info], Capacity: [capacity]kg
  • Main.java: أنشئ كائن WashingMachine واعرض معلوماته الكاملة. ستتلقى ثلاثة مدخلات: العلامة التجارية (String)، والقدرة الكهربائية (int)، والسعة (int). اطبع نتيجة استدعاء getInfo() على الغسالة الخاصة بك.

ستتلقى ثلاثة مدخلات: اسم العلامة التجارية، والقدرة الكهربائية، والسعة.

لاحظ كيف تخدم super غرضين هنا: استدعاء منشئ الفئة الأم لتهيئة الحقول الموروثة، واستدعاء دالة الفئة الأم للبناء على سلوكها بدلاً من استبداله بالكامل.

ورقة مرجعية

تشير الكلمة المفتاحية super إلى الفئة الأب (parent class) من داخل فئة فرعية (subclass).

استخدم super() لاستدعاء منشئ الفئة الأب (parent constructor). يجب أن يكون هذا هو البيان الأول في منشئ الفئة الفرعية:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // يجب أن يكون السطر الأول
        this.doors = doors;
    }
}

استخدم super.methodName() لاستدعاء دوال الفئة الأب، وهو أمر مفيد عندما تقوم الفئة الفرعية بتجاوز (override) دالة ما:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // يستدعي نسخة Animal
        System.out.println("Meow!");
    }
}

تشير super إلى جزء الفئة الأب من الكائن، بينما تشير this إلى الكائن الحالي.

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String brand = scanner.nextLine();
        int wattage = scanner.nextInt();
        int capacity = scanner.nextInt();
        
        // TODO: إنشاء كائن WashingMachine باستخدام قيم المدخلات
        
        // TODO: طباعة نتيجة استدعاء getInfo() على washing machine
    }
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming