نحوه ی ایجاد اینترفیس در زبان برنامه نویسی جاوا


پس از آشنایی با مفهوم اینترفیس در آموزش قبل، در این آموزش قصد داریم ببینیم به چه شکل می توان یک اینترفیس ایجاد کرد. برای این منظور، پروژه ای تحت عنوان Interface ایجاد کرده و فایلی در آن تحت عنوان ProgrammerOne ایجاد می کنیم:

public interface ProgrammerOne {
    public void designTheUI();
}

همان طور که در کد فوق ملاحظه می شود، برای ساخت یک اینترفیس می بایست از کلید واژه ی interface استفاده کنیم. سپس بایستی یک نام برای آن انتخاب کنیم که در مثال فوق نام ProgrammerOne به معنی «برنامه نویس شماره یک» انتخاب شده است (اگر به خاطر داشته باشیم، در آموزش گذشته مثالی زدیم مبنی بر این که فرض کنیم که عضو یک تیم برنامه نویسی هستیم که در آن هر برنامه نویس وظیفه ای خاص دارد.) کلید واژه ی public هم که پیش از کلید واژه interface قرار گرفته است حاکی از آن است که این Interface توسط هر کلاسی که در هر پکیجی قرار داشته باشد قابل روئیت و استفاده است.

لازم به ذکر است همان طور که در آموزش پیش توضیح داده شد، نام فایلی که حاوی این اینترفیس است می بایست با نام انتخابی ما یکی باشد بنابراین نام این اینترفیس معادل با ProgrammerOne.java است. سپس همانند ساخت یک کلاس از دو علامت { } استفاده کرده و متدهایی که نیاز داشته باشیم را میان آن دو تعریف می کنیم.

به طور مثال، در کد فوق یک متد تحت عنوان designTheUI به معنی «طراحی کردن رابط گرافیکی کاربر» تعریف کرده ایم. اگر توجه کرده باشیم متدی که داخل این اینترفیس ایجاد کرده ایم بر خلاف متدهایی که داخل کلاس تعریف می کنیم دارای { } نیست و این مسئله از آنجا ناشی می شود که متدهای داخل یک اینترفیس فقط دارای Signature هستند. به عبارت دیگر متدهای داخل اینترفیس فقط به صورت انتزاعی تعریف می شوند سپس داخل کلاسی که قرار است آن اینترفیس را اجرا کند، وظایف متد را داخل دو علامت { } مرتبط با آن تعریف می کنیم.

نکته
جالب است بدانیم کلیه ی متدهایی که داخل یک اینترفیس ایجاد می شوند public خواهند بود بنابراین نوشتن یا ننوشتن این کلید واژه برای متدهای داخل یک اینترفیس تفاوتی ایجاد نخواهد کرد.

حال نیاز داریم کلاسی ایجاد کنیم که این وظیفه را دارا است تا اینترفیسی که ایجاد کرده ایم را اجرا کند. برای این منظور، کلاسی تحت عنوان ActionClass به معنی «کلاس اجرایی» ایجاد می کنیم (به خاطر داشته باشیم که در حین ساخت این کلاس گزینه public static void main را تیک دار نماییم):

public class ActionClass {
    public static void main(String[] args) {
    }
}

در زبان برنامه نویسی جاوا هر زمانی که بخواهیم به یک کلاس دستور دهیم که یک اینترفیس را اجرا کند، می بایست از کلید واژه ی implements به معنی «اجرا کردن» استفاده نماییم. در واقع، همان طور که از کلید واژه ی extends به منظور ارث بری از یک کلاس دیگر استفاده می کنیم، کلید واژه implements را نوشته سپس نام اینترفیس مد نظر که تمایل داریم کلاس ما آن را اجرا کند را می نویسیم:

public class ActionClass implements ProgrammerOne{
    public static void main(String[] args) {
    }
}

اکنون نیاز داریم تا متدی که به صورت انتزاعی در اینترفیس خود ایجاد کردیم را فرا خوانده و وظیفه یی برای آن تعریف کنیم:

public class ActionClass implements ProgrammerOne {
    @Override
    public void designTheUI() {
        System.out.println("Programmer one has to design the UI");
    }
    public static void main(String[] args) {
    }
}

همان طور که در کد فوق ملاحظه می شود، داخل کلاس اصلی برنامه متدی تحت عنوان designTheUI را که داخل اینترفیس خود ایجاد کرده ایم را فرا خوانده ایم. اگر توجه کرده باشیم ما داخل اینترفیس فقط این متد را به صورت انتزاعی ایجاد کردیم و وظیفه ای برای آن تعریف نکردیم اما این در حالی است که داخل کلاس وظیفه آن را به صراحت مشخص می کنیم که حاکی از آن است که عبارت Programmer one had to design the UI به معنی «برنامه نویس شماره یک بایستی رابط گرافیکی را طراحی کند» را روی صفحه به نمایش در آورد.

نکته ای که در اینجا حائز اهمیت است این است که پس از وارد کردن این متد داخل برنامه اکلیپس از ما ایراد خواهد گرفت که بایستی متد را Override کرد (برای آشنایی بیشتر با دستور Override به آموزش های گذشته مراجعه نمایید.) به طور خلاصه، علت اجباری بودن Override این است که از ایجاد مشکلات احتمالی جلوگیری به عمل آید. حال کد خود را به صورت زیر تکمیل می کنیم:

public class ActionClass implements ProgrammerOne {
    @Override
    public void designTheUI() {
        System.out.println("Programmer one has to design the UI");
    }
    public static void main(String[] args) {
        ActionClass test = new ActionClass();
        test.designTheUI();
    }
}

در واقع برای آن که برنامه ی ما اجرا شود نیاز داریم تا به تکمیل متد main بپردازیم زیرا همان طور که قبلاً توضیح داده شد، این متد به منزله نقطه شروع برنامه ی ما خواهد بود. کاری که در متد main انجام داده ایم این است که یک آبجکت تحت عنوان test از روی کلاس ActionClass ایجاد کرده ایم. در واقع برای این منظور می بایست اول نام کلاس خود را نوشته سپس نامی برای آن در نظر بگیریم و یک علامت مساوی قرار می دهیم. حال از آنجا که می خواهیم یک آبجکت جدید ایجاد کنیم، می بایست کلید واژه ی new را بنویسیم سپس مجدد نام کلاسی که می خواهیم از روی آن یک آبجکت جدید ایجاد کنیم را خواهیم نوشت و یک علامت ;() در انتها قرار می دهیم. از این پس به کلیه متدها، اینترفیس ها و دیگر کلاس های مرتبط با این کلاس دسترسی خواهیم داشت. حال نام آبجکت ساخته شده از روی کلاس ActionClass را نوشته یک نقطه قرار می دهیم و سپس نام متدی که در اینترفیس ایجاد کردیم را می نویسیم. پس از اجرای برنامه خروجی زیر مشاهده خواهد شد:

همان طور که می بینیم، با موفقیت توانستیم یک اینترفیس ایجاد کنیم سپس آن را در کلاس خود اصطلاحاً implements کرده و در نهایت با ساخت یک آبجکت از روی کلاس خود، توانستیم برنامه ای که حاوی یک اینترفیس و یک کلاس و یک متد بود را اجرا نماییم. در پایان این نکته را فراموش نکنیم کلاسی که دست به اجرای یک اینترفیس می زند می بایست کلیه متدهای موجود در آن اینترفیس را نیز اجرا نماید.

دانلود فایل‌های تمرین


بهزاد مرادی

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
shirin hosseini
shirin hosseini
۱۳۹۷/۰۵/۲۲
سلام
در ابتدای آموزش نوشته شده که ابتدا یک پروژه تحت عنوان inteface میسازیم و سپس یک فایل تحت عنوان programmerOne ایجاد میکنیم در صورتی که باید گفته میشد که یک interface تحت این عنوان ایجاد میکنیم. همین موضوع منو به اشتباه بردچون من به جای ایجاد اینترفیس از بخش new گزینه ی file رو انتخاب میکردم.
با تشکر
کاربر میهمان
کاربر میهمانمن یک کاربر مهمان هستم
۱۳۹۷/۰۴/۰۳
بسم الله الرحمن الرحیم
با سلام و سپاس

ضمن تشکر مجدد از آموزشهای مفیدتون، نکته‌ای به نظرم رسید خواستم عرض کنم
به نظرم «پیاده‌سازی» معنی مناسب‌تری برای واژه implements باشه. البته که احتمالا این ترجمه رو هم میدونستید و به دلیل موضوعی دیگه به «اجرا» ترجمه شده.
اما ممکنه دوستان اینطوری برداشت کنند که متدهایی که توی یه اینترفیس نوشته میشن حتما باید توی کلاسی که implements کرده «run» بشن! در صورتی که اینطور نیست و فقط لازمه پیاده‌سازی بشن.

سپاس دوباره
arabi83
arabi83
۱۳۹۷/۰۱/۲۲
ممنون خیلی عالی بود
دوستان میتونند برای به دست آوردن اطلاعات بیشتر در مورد interface به لینک زیر مراجعه کنند:
http://opizo.com/eaDqnR
کاربر میهمان
معینمن یک کاربر مهمان هستم
۱۳۹۵/۰۷/۰۷
این کد رو نوشتم
public class Main implements NewClass {
@Override
public int char hello(){
int a=2;
return a + "sal"

}
کاربر میهمان
معینمن یک کاربر مهمان هستم
۱۳۹۵/۰۷/۰۷
سلام.ایا یک اینترفیس وقتی که override میشه میتونه هم یک مقدار int و هم یک مقدار string رو return کنه؟
کاربر میهمان
popoمن یک کاربر مهمان هستم
۱۳۹۵/۰۷/۰۳
خیلی ممنون از اموزش خوبتون. من منتها یک انتقادی دارم ازتون. الانا که وارد مباحث مهم و پیچیده تر شدیم شما نحوه ی سینتاکس رو گفتید ولی هیچ جا اشاره ای به کاربرد و benefit واقعی نکردید. هم توی constructor هم اینجا توی interface من یاد گرفتم چطوری تعریفشون کنم ولی اصلا نفهمیدم به چه درد میخورن و کجا ی کارم نیازه که تعریفشون کنم.
ممنون
mortezahbh
mortezahbh
۱۳۹۵/۰۴/۱۲
باسلام
من متوجه نشدم درچه مواقع از اینترفیس استفاده میکنیم؟
اگه میشه توی یک مثال بگید
ممنون
mohammad m
mohammad m
۱۳۹۵/۰۲/۰۳
حیلی ممنون از اموزش های خوبتون واقعا مفیدن
کاربر میهمان
خوش راهمن یک کاربر مهمان هستم
۱۳۹۴/۱۱/۱۰
با درود. با سپاس از زحمات آقای مرادی و دست اندرکاران؛ آموزش ها خیلی خوبن؛ اما اینجا مطلبم مرتبط با یک ایراد فنی سایت هست و اون هم اینه که پاسخ نظر پایین توسط آقای دوشیری، یک روز پیش از تاریخ پرسش توسط کاربر ثبت شده. چطور میشه که این طور میشه؟ شما بهتر می دونید؛ من رشته ام بینایی ماشین هست.
کاربر میهمان
زکیهمن یک کاربر مهمان هستم
۱۳۹۴/۱۰/۲۳
آخرین جمله ای که نوشتین در مورد اینترفیس... خواستم بدونم همین خاصیت رو ما در inheritance هم داشتیم درسته؟