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

معامل الـ instanceof

جزء من قسم البرمجة كائنية التوجه في رحلة Java على Coddy. الدرس 31 من 87.

أوضح الدرس السابق أن عملية downcasting قد تفشل مع ClassCastException إذا لم يكن الكائن فعليًا من النوع الذي تُجري التحويل إليه. يحلّ عامل التشغيل instanceof هذه المشكلة من خلال إتاحة التحقق من نوع الكائن قبل إجراء التحويل.

البنية بسيطة: تُرجع object instanceof ClassName القيمة true إذا كان الكائن مثيلًا من ذلك الصنف (أو من أي صنف فرعي له):

Animal animal = new Dog();

if (animal instanceof Dog) {
    Dog dog = (Dog) animal;
    dog.bark();  // من الآمن استدعاء الدوال الخاصة بـ Dog
}

يمنع هذا الفحص أخطاء وقت التشغيل من خلال ضمان نجاح التحويل. يعيد العامل أيضًا true للأنواع الأصلية في التسلسل الهرمي:

Dog dog = new Dog();
System.out.println(dog instanceof Dog);     // true
System.out.println(dog instanceof Animal);  // true
System.out.println(dog instanceof Object);  // true

منذ Java 16، يمكنك الجمع بين الفحص والتحويل في خطوة واحدة باستخدام مطابقة الأنماط:

if (animal instanceof Dog dog) {
    dog.bark();  // 'dog' تم تحويل نوعه بالفعل وجاهز للاستخدام
}

تزيل هذه الصياغة الأنظف سطر التحويل المنفصل. لاحظ أن instanceof تُرجع false عند اختبارها مقابل null، لذا لا تحتاج إلى فحص منفصل للقيمة الفارغة.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لفحص المركبات يستخدم العامل instanceof للتعرّف بأمان على أنواع المركبات المختلفة والتعامل معها. ستنشئ تسلسلًا هرميًا للمركبات وتكتب تعليمات برمجية تتحقق من النوع الفعلي لكل مركبة قبل الوصول إلى ميزاتها المتخصصة.

ستنظّم تعليماتك البرمجية عبر أربعة ملفات:

  • Vehicle.java: أنشئ الفئة الأساسية التي تشترك فيها جميع المركبات. تحتوي كل مركبة على الحقل model (String). أدرج مُنشئًا لتهيئته، وطريقة getter هي getModel()، وطريقة inspect() تطبع: Inspecting vehicle: [model]
  • Car.java: أنشئ فئة تمتد من Vehicle. تحتوي Cars على الحقل الإضافي numDoors (int). استخدم super لتهيئة الفئة الأصل. أضف طريقة checkDoors() تطبع: [model] has [numDoors] doors
  • Motorcycle.java: أنشئ فئة أخرى تمتد من Vehicle. تحتوي Motorcycles على الحقل hasSidecar (boolean). أضف طريقة checkSidecar() تطبع إما [model] has a sidecar أو [model] has no sidecar اعتمادًا على قيمة boolean.
  • Main.java: هنا يصبح instanceof أساسيًا! ستتلقى أربعة مدخلات: طراز السيارة، وعدد الأبواب، وطراز الدراجة النارية، وما إذا كانت تحتوي على عربة جانبية (true/false).

    أنشئ مصفوفة من مراجع Vehicle تحتوي على Car وMotorcycle. ثم نفّذ حلقة عبر المصفوفة، ولكل مركبة:

    • استدعِ الطريقة الأساسية inspect()
    • استخدم instanceof للتحقق مما إذا كانت Car — وإذا كان الأمر كذلك، نفّذ downcast بأمان واستدعِ checkDoors()
    • استخدم instanceof للتحقق مما إذا كانت Motorcycle — وإذا كان الأمر كذلك، نفّذ downcast بأمان واستدعِ checkSidecar()

ستتلقى أربعة مدخلات: طراز السيارة (String)، وعدد الأبواب (int)، وطراز الدراجة النارية (String)، وhasSidecar (boolean).

يجب أن يُظهر ناتجك أربعة أسطر — لكل مركبة، سترى رسالة فحصها، تليها عملية التحقق الخاصة بنوعها. يضمن العامل instanceof أنك لا تستدعي طرق Car إلا على Cars فعلية، ولا طرق Motorcycle إلا على Motorcycles فعلية، مما يمنع حدوث ClassCastException!

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String carModel = scanner.nextLine();
        int numDoors = Integer.parseInt(scanner.nextLine());
        String motorcycleModel = scanner.nextLine();
        boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
        
        // TODO: إنشاء كائن Car باستخدام carModel و numDoors
        
        // TODO: إنشاء كائن Motorcycle باستخدام motorcycleModel و hasSidecar
        
        // TODO: إنشاء مصفوفة من مراجع Vehicle تحتوي على Car و Motorcycle
        
        // TODO: التكرار عبر المصفوفة ولكل مركبة:
        // 1. استدعاء الدالة inspect()
        // 2. استخدام instanceof للتحقق مما إذا كانت Car، ثم إجراء downcast واستدعاء checkDoors()
        // 3. استخدام instanceof للتحقق مما إذا كانت Motorcycle، ثم إجراء downcast واستدعاء checkSidecar()
    }
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Java عبر الإنترنت