Java: الواجهات و Lambda

الواجهات (Interfaces) تحدد عقدًا (contract) تلتزم به الفئات. في هذا الدرس، سنتعلم كيفية استخدام الواجهات.

1. تعريف الواجهة

JAVA
public interface Drawable {
    void draw();  // دالة مجردة
    void setColor(String color);  // دالة مجردة
}

2. تنفيذ الواجهة

JAVA
public class Circle implements Drawable {
    private String color;
    
    @Override
    public void draw() {
        System.out.println("رسم دائرة");
    }
    
    @Override
    public void setColor(String color) {
        this.color = color;
        System.out.println("اللون: " + color);
    }
}

public class Rectangle implements Drawable {
    private String color;
    
    @Override
    public void draw() {
        System.out.println("رسم مستطيل");
    }
    
    @Override
    public void setColor(String color) {
        this.color = color;
        System.out.println("اللون: " + color);
    }
}

3. الواجهات مع تعدد الأشكال

JAVA
Drawable[] shapes = {new Circle(), new Rectangle()};

for (Drawable shape : shapes) {
    shape.setColor("أحمر");
    shape.draw();
}

4. تنفيذ عدة واجهات

JAVA
public interface Printable {
    void print();
}

public interface Serializable {
    void save();
}

public class Document implements Printable, Serializable {
    @Override
    public void print() {
        System.out.println("طباعة المستند");
    }
    
    @Override
    public void save() {
        System.out.println("حفظ المستند");
    }
}

5. الدوال الافتراضية (Java 8+)

JAVA
public interface Logger {
    void log(String message);
    
    // دالة افتراضية
    default void logError(String message) {
        log("خطأ: " + message);
    }
    
    // دالة ثابتة
    static Logger createConsoleLogger() {
        return message -> System.out.println("[LOG] " + message);
    }
}

public class FileLogger implements Logger {
    @Override
    public void log(String message) {
        System.out.println("[FILE] " + message);
    }
}

// الاستخدام
Logger logger = new FileLogger();
logger.log("رسالة");           // [FILE] رسالة
logger.logError("خطأ");       // [FILE] خطأ: خطأ

Logger console = Logger.createConsoleLogger();
console.log("رسالة");         // [LOG] رسالة

6. الواجهات الوظيفية (Functional Interfaces)

واجهة وظيفية هي واجهة تحتوي على دالة مجردة واحدة فقط:

JAVA
@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

// استخدام Lambda
Calculator add = (a, b) -> a + b;
Calculator subtract = (a, b) -> a - b;
Calculator multiply = (a, b) -> a * b;

System.out.println(add.calculate(5, 3));       // 8
System.out.println(subtract.calculate(5, 3));  // 2
System.out.println(multiply.calculate(5, 3));  // 15

7. الواجهات المدمجة

(1) Comparable — للمقارنة

TEXT 📖 للعرض فقط
public class Student implements Comparable<Student> {
    private String name;
    private double gpa;
    
    public Student(String name, double gpa) {
        this.name = name;
        this.gpa = gpa;
    }
    
    @Override
    public int compareTo(Student other) {
        return Double.compare(this.gpa, other.gpa);
    }
}

// استخدام
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("أحمد", 3.5));
students.add(new Student("محمد", 3.8));
students.add(new Student("علي", 3.2));

Collections.sort(students);  // ترتيب حسب GPA

(2) Runnable — للخيوط

TEXT 📖 للعرض فقط
public class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("المهمة تعمل في خيط: " + Thread.currentThread().getName());
    }
}

// استخدام
Thread thread = new Thread(new MyTask());
thread.start();

// بـ Lambda
Thread thread2 = new Thread(() -> {
    System.out.println("Lambda تعمل في خيط");
});
thread2.start();

▶ مثال

JAVA
interface Printable {
    void print();
}
class Doc implements Printable {
    public void print() { System.out.println("Printing..."); }
}
▶ جرّب الكود

❓ أسئلة شائعة

س ما الفرق بين الواجهة والفئة المجردة؟
ج الواجهة: عقد بحت (دوال مجردة فقط). الفئة المجردة: يمكن أن تحتوي على كود عادي.
س لماذا نستخدم @FunctionalInterface؟
ج للتحقق من أن الواجهة تحتوي على دالة مجردة واحدة فقط.
س هل يمكن أن تحتوي الواجهة على متغيرات؟
ج المتغيرات في الواجهة تكون public static final (ثوابت).

📖 ملخص

📝 تمارين

  1. أشكال: أنشئ واجهة Shape مع دوال للمساحة والمحيط
  2. وظائف: أنشئ واجهة Payable مع دالة calculatePay
  3. Lambda: استخدم Lambda لترتيب ArrayList

8. الدرس التالي

في الدرس التالي، سنتعلم Enums والفئات الداخلية — الأنواع المخصصة والفئات المتداخلة.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%