را

رابط در 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 اینترفیس‌های دیگر را گسترش دهند.

اعضای یک اینترفیس به‌طور پیش‌فرض public هستند.

اینترفیس‌ها می‌توانند نوع‌های تودرتو داشته باشند: interfaces، enums و classes. در اینجا، اینترفیس‌های دربرگیرنده نقش فضای‌نام را ایفا می‌کنند. به نوع‌های تودرتو از بیرون اینترفیس، با آوردن نام اینترفیس در ابتدا و استفاده از روش نوشتن با نقطه برای مشخص کردن عضو، دسترسی پیدا می‌شود.

طبق طراحی، Java از وراثت چندگانه پشتیبانی نمی‌کند، اما نوعی وراثت چندگانه را از طریق اینترفیس‌ها امکان‌پذیر می‌سازد.

علاوه بر این، این مفهوم که چندریختی را می‌توان از طریق اینترفیس‌ها پیاده‌سازی کرد، زیربنای سازوکار اینترفیس است.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

رابط را یاد بگیرید