interface  در جاوا

ناصر نادری | 1393/12/24


بنام  خدا  . امروز میخواییم در باره interface ها که نقش مهمی در مفهوم شی گرایی بازی میکنن صحبت کنیم .

یک interface  در واقع  شبیه به یک کلاس از متدهای abstract هست . دقت کنید که اینترفیس کلاس نیست چرا که توی کلاس ما متدها و خصوصیات رو تعریف و پیاده سازی میکنیم در صورتی که توی interface متدها رو فقط به شکل abstract تعریف میکنیم و پیاده سازی نمیکنیم .   کاربرد اصلی interface ارث بری ازش هست . متدهای abstract یک اینترفیس رو ماتوکلاسی که ازش ارث بری داشته پیاده سازی میکنیم ..

شباهتهای interface با کلاس :

1- یک اینترفیس میتونه حاوی هر تعداد متدی باشه .

2- مثل کلاس فایلی که حاوی یک اینترفیس هست باید با نام اون اینترفیس ذخیره بشه .

3- اینترفیس ها هم در نهایت به bytecode با پسوند class ترجمه میشه .

4- اینترفیس ها  مثل کلاسها در داخل یک پکیج هستند و تمام قوانین package برای اینترفیس و کلاس مثل همه .

تفاوتهای  interface با کلاس :

1-  شما نمیتونید یک نمونه شی از یک interface تعریف کنید .

2- اینترفیس سازنده نداره .

3- تمام متدهای  اینترفیس از نوع abstract بدون بدنه هست .

4- شما فقط میتونید خصوصیاتی از نوع final و static تعریف کنید .

5- ارث بری از اینترفیس با کلمه کلیدی implements هست نه با extends .

6- یک اینترفیس میتونه از چند اینترفیس ارث بری داشته باشه .

تعریف کلی یک interface در جاوا به شکل زیر هست :

 /* نام فایل : MyInterface.java */
import java.lang.*;
//هر تعداد import که مورد نیاز باشد

public interface MyInterface
{
    //هر تعداد فیلد از نوع final و static
    //هر تعداد متد از نوع abstract
} 

یک اینترفیس خودش abstract هست  و متدهاش هم همینطور در نتیجه نیازی به استفاده از کلمه کلیدی abstract برای تعریف اینترفیس و متدهاش نیست .

متدهای داخل یک اینترفیس بصورت ضمنی public هستند .

 /* نام فایل : Phone.java */
interface Phone {

    public void ring();
    public void charge();
} 

وقتی کلاسی از اینترفیس ارث بری داره باید تمام متدهای اینترفیس رو پیاده سازی کنه در غیر اینصورت خودشم باید abstract باشه .

 /* نام فایل : Nokia.java */
public class MammalInt implements Animal{
//ارث بری با کلمه کلیدی implements
    public void ring(){
        System.out.println("Nokia is ringing");
    }    
   //پیاده سازی متدهای داخل اینترفیس
    public void charge(){
        System.out.println("Nokia is charging");
    } 

    public int getSerial(){
        return 10;
    }

    public static void main(String args[]){
        Nokia nokia = new Nokia();
        nokia.ring();
        nikia.charge();
    }
} 

چند تا قانون برای implement  کردن یک اینترفیس هست که باید بدونیم :

1-  یک کلاس میتونه از بیش از یک اینترفیس ارث بری داشته باشه .

2- یک کلاس میتونه فقط از یک کلاس ارث بری داشته باشه .

3- یک اینترفیس میتونه با کلمه کلیدی extends از یک اینترفیس دیگه ارث بری داشته باشه .

 //نام فایل: Sports.java
public interface Sports
{
    public void setHomeTeam(String name);
    public void setVisitingTeam(String name);
}

//نام فایل: Football.java
//ارث بری یک اینترفیس از یک اینترفیس دیگه
public interface Football extends Sports
{
    public void homeTeamScored(int points);
    public void visitingTeamScored(int points);
    public void endOfQuarter(int quarter);
}

//نام فایل: Hockey.java
//ارث بری یک اینترفیس از یک اینترفیس دیگه
public interface Hockey extends Sports
{
    public void homeGoalScored();
    public void visitingGoalScored();
    public void endOfPeriod(int period);
    public void overtimePeriod(int ot);
} 

ارث بری یک اینترفیس از چند اینترفیس :

public interface Hockey extends Sports, Event

یکی از استفاده های اینترفیس در جاوا تعریف اینترفیس خالی هست که بعنوان یک والد عمومی برای تمامی کلاسها و انترفیسهایی  که قراره ازش ارث بری داشته باشن شناخته میشه .

 package java.util;
public interface EventListener
{} 

این نوع اینترفیس هار اینترفیس برچسبی یا tagging interface میگن .  که با دو هدف تعریف میشن :

1- حالت والد عمومی دادن به یک اینترفیس . این باعث میشه که مثلا جاوا توی بستر های مختلف از یک اینترفیس با یک نام واحد توسط تعداد زیادی از کلاسها و اینترفیسها از اینترفیس برچسبی ارث بری داشته باشه .  مثلا توی برنامه نویسی اندروید به همون نامی یک رویداد رو تعریف میکنیم که در برنامه نویسی جاوا برای ویندوز . درصورتی که میدونیم پیاده سازی بدنه این کلاسها کاملا متفاوت هست ولی برنامه نویس فقط یه اسم رو یاد میگیره برای تمام بسترها .

2- اضافه کردن یک نوع داده به کلاس :  کلاسی که از یک اینترفیس برچسبی یا tagging interface ارث بری داره نیازی نداره که متدی رو override کنه و خودش میشه یک نوع از اون اینترفیس و بدین ترتیب یک polymorphism یا چندریختی در سطح کلاس خواهیم داشت .

شی گرایی در این جلسه تموم میشه امید وارم استفاده کرده باشین . برخی از قسمتها ترجمه شده از مراجع انگلیسی هست اگر اشکالی داشته بذارید به پای کم سوادیمون .

تا  دوره بعدی در پناه حق .


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید