ال

الواجهات في Java

1 تمرين

نبذة عن الواجهات

تُعدّ interfaces الوسيلة الأساسية لـفصل استخدامات الصنف عن تنفيذه. ويمنح هذا الفصل مرونة في صيانة التنفيذ، ويساعد على دعم سلوك عام آمن من حيث الأنواع.

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

public interface Language {
    String speak();
}

public interface ItalianLanguage extends Language {
    String speak();
    String speakItalian();
}

public interface ScriptConverter {
    void setVersion(String version);
    String getVersion();
    String convertCyrillicToLatin(String cyrillic);
}

يجب على الصنف الذي ينفّذ الواجهة أن ينفّذ كل العمليات التي تعرّفها الواجهة.

عادةً ما تقوم الواجهات بواحد أو أكثر مما يلي:

  • السماح للكود المستخدِم بالتعامل مع عدد من الأصناف المختلفة بصورة عامة. وفي هذه الحالة تؤدي الواجهات الدور نفسه الذي يؤديه الصنف الأساس. ومن الأمثلة على ذلك java.io.InputStream،
  • كشف مجموعة فرعية من الوظائف لغرض محدد (مثل Comparable<T>)
  • كشف API العام لصنف ما بحيث يمكن لعدة تنفيذات أن تتعايش معًا. ومن الأمثلة على ذلك البديل الاختباري
public class ItalianTraveller implements ItalianLanguage {

    public String speak() {
        return "Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class ItalianTravellerV2 implements ItalianLanguage {

    public String speak() {
        return "migliorata - Ciao mondo";
    }

    public String speakItalian() {
        return speak();
    }
}

public class FrenchTraveller implements Language {
    public String speak() {
        return "Ça va?";
    }
}

public class RussianTraveller implements Language, ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String speak()
    {
        return "Привет мир";
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

public class DocumentTranslator implements ScriptConverter {

    private String version;

    public void setVersion(String version) {
        this.version = version;
    }

    public String getVersion() {
        return version;
    }

    public String translate(String russian) {
        throw new UnsupportedOperationException();
    }

    public String convertCyrillicToLatin(String cyrillic) {
        throw new UnsupportedOperationException();
    }
}

يمكن للكود الذي يستخدم الواجهات والأصناف السابقة أن:

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

تُستخدم الواجهات على نطاق واسع لدعم الاختبار، إذ تتيح المحاكاة بسهولة.

يمكن للواجهات أن توسّع واجهات أخرى باستخدام الكلمة المفتاحية extend.

أعضاء الواجهة عامة افتراضيًا.

يمكن أن تحتوي الواجهات على أنواع متداخلة: interfaces وenums وclasses. وهنا تعمل الواجهات الحاوية بمثابة فضاءات الأسماء. ويُوصَل إلى الأنواع المتداخلة من خارج الواجهة بوضع اسم الواجهة قبلها واستخدام صيغة النقطة لتحديد العضو.

بحكم التصميم، لا تدعم Java الوراثة المتعددة، لكنها تسهّل نوعًا من الوراثة المتعددة عبر الواجهات.

علاوة على ذلك، فإن مفهوم تعدد الأشكال القابل للتحقيق عبر الواجهات هو الأساس الذي تقوم عليه آلية الواجهة.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم الواجهات