آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

آموزش کار با interface در Java

دوره های مرتبط با این مقاله

آموزش Java – کار با interface در جاوا

interface در جاوا مانند یک الگو یا نقشه برای کلاس می باشد. این ساختار دارای ثوابت static و متدهای بدون بدنه (abstract) می باشد. به عبارت دیگر interface مکانیزمی برای پیاده سازی مفهوم انتزاع (abstraction) در برنامه نویسی می باشد. لازم به ذکر است که داخل interface توسعه دهنده می تواند فقط متدهای abstract و بدون بدنه تعریف کند.

کاربرد اصلی interface در جاوا در فراهم کردن زمینه ای برای پیاده سازی مفهوم abstraction و وراثت چندگانه (multiple inheritance) خلاصه می شود.

interface در جاوا همچنین نشانگر رابطه ی IS-A می باشد. مانند کلاس های abstract امکان نمونه سازی (instantiation) از روی interface وجود دارد.

دلایل استفاده از interface در جاوا

سه دلیل اصلی برای استفاده interface به شرح زیر می باشند:

  1. پیاده سازی مفهوم abstraction در نوشتن برنامه
  2. پیاده سازی قابلیت وراثت چندگانه یا multiple inheritance در جاوا
  3. پیاده سازی مفهوم loose coupling و کاستن وابستگی آبجکت ها به هم در اپلیکیشن

بهبود interface در ویرایش 8 Java

از ویرایش 8 زبان Java، interface می تواند متدهای پیش فرض و static داشته باشد که بعدا درباره ی آن ها بحث خواهیم کرد.

کامپایلر جاوا کلیدواژگان public و abstract را به صورت پیش فرض قبل از اسم متد اعلان شده در بدنه ی interface اضافه می کند. همچنین قبل از متغیرها و فیلدهای داده ای آن، کلیدواژگان public، static و final را درج می نماید.

به عبارت دیگر، فیلدهای interface به صورت پیش فرض public، static و final هستند و متدهای تعریف شده در بدنه ی آن public و abstract می باشند.

آموزش Java

فهم رابطه ی کلاس و interface

¬همان طور که در تصویر زیر مشاهده می کنید، کلاس از کلاس دیگری ارث بری می کند، یک interface نیز می تواند از interface دیگری ارث بری داشته باشد اما کلاس interface را با کلیدواژه ی implement در بدنه ی خود پیاده سازی می کند.

آموزش Java

مثال ساده ای از interface در جاوا

در این مثال، interface ای به نام printable تنها یک متد در بدنه ی خود دارد که کلاس A6 با کلیدواژه ی implement آن را داخل خود پیاده سازی می کند.

                                
interface printable{  
void print();  
}  
class A6 implements printable{  
public void print(){System.out.println("Hello");}  
public static void main(String args[]){  
A6 obj = new A6();  
obj.print();  
 }  
}  

خروجی:

Hello

مثال کاربردی از interface در Java: اینترفیس Drawable

در این مثال، اینترفیس Drawable تنها یک متد دارد. کلاس های Rectangle و Circle متد نام برده را در خود پیاده سازی می کنند. در یک پروژه ی واقعی، interface را یک نفر تعریف می کند اما هر توسعه دهنده آن را در کلاس خود به صورت اختصاصی پیاده سازی می کند. سپس آن را شخص دیگری استفاده می کند. لازم به ذکر است پیاده سازی و بدنه ی متد در هر کلاس توسط توسعه دهنده که آن را در کلاس خود پیاده سازی می کند، کپسوله و پنهان می شود.

فایل: TestInterface1.java

//Interface declaration: by first user  
interface Drawable{  
void draw();  
}  
//Implementation: by second user  
class Rectangle implements Drawable{  
public void draw(){System.out.println("drawing rectangle");}  
}  
class Circle implements Drawable{  
public void draw(){System.out.println("drawing circle");}  
}  
//Using interface: by third user  
class TestInterface1{  
public static void main(String args[]){  
Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable()  
d.draw();  
}}  

خروجی:

drawing circle

مثال کاربردی از Interface: پیاده سازی اینترفیس Bank

در زیر مثال دیگری از یک interface جاوا به نام Bank را مشاهده می کنید که سه کلاس آن را در بدنه ی خود پیاده سازی می کنند.

فایل: TestInterface2.java

interface Bank{  
float rateOfInterest();  
}  
class SBI implements Bank{  
public float rateOfInterest(){return 9.15f;}  
}  
class PNB implements Bank{  
public float rateOfInterest(){return 9.7f;}  
}  
class TestInterface2{  
public static void main(String[] args){  
Bank b=new SBI();  
System.out.println("ROI: "+b.rateOfInterest());  
}}  

خروجی:

ROI: 9.15

پیاده سازی وراثت چندگانه (multiple inheritance) در جاوا به وسیله ی interface

اگر یک کلاس همزمان چندین interface را پیاده سازی کند یا یک interface واحد چندین interface دیگر را به ارث ببرد، در اصطلاح برنامه نویسی شی گرا به آن multiple inheritance یا وراثت چندگانه گویند.

آموزش Java
interface Printable{  
void print();  
}  
interface Showable{  
void show();  
}  
class A7 implements Printable,Showable{  
public void print(){System.out.println("Hello");}  
public void show(){System.out.println("Welcome");}  
public static void main(String args[]){  
A7 obj = new A7();  
obj.print();  
obj.show();  
 }  
}  

خروجی:

Hello
Welcome

چرا وراثت چندگانه از طریق interface قابل پیاده سازی بوده، اما از طریق کلاس قابل پیاده سازی نمی باشد؟

همان طور که قبلا در مبحث وراثت تشریح شد، در جاوا امکان پیاده سازی وراثت چندگانه از طریق کلاس به دلیل رخداد ابهام وجود ندارد. اما می توان با استفاده از interface بدون اینکه ابهامی رخ دهد، وراثت چندگانه را پیاده سازی کرد. در واقع از آنجایی که کلاس ارث برنده از interface مورد نظر پیاده سازی را ارائه می دهد، دیگر ابهامی در کد رخ نمی دهد. مثال:

interface Printable{  
void print();  
}  
interface Showable{  
void print();  
}    
class TestInterface3 implements Printable, Showable{  
public void print(){System.out.println("Hello");}  
public static void main(String args[]){  
TestInterface3 obj = new TestInterface3();  
obj.print();  
 }  
}  

خروجی:

Hello

همان طور که در مثال بالا می بینید، دو اینترفیس Printable و Showable تعدادی متد دارند که کلاس TestTnterface1 آن ها را پیاده سازی می کند. به همین جهت هیچ گونه ابهامی در کد رخ نمی دهد.

ارث بری Interface از interface دیگر

یک کلاس interface را پیاده سازی می کند اما یک interface از interface دیگر ارث بری دارد.

interface Printable{  
void print();  
}  
interface Showable extends Printable{  
void show();  
}  
class TestInterface4 implements Showable{  
public void print(){System.out.println("Hello");}  
public void show(){System.out.println("Welcome");}  
public static void main(String args[]){  
TestInterface4 obj = new TestInterface4();  
obj.print();  
obj.show();  
 }  
}  

خروجی:

Hello
Welcome

متد پیش فرض Java 8 در interface

از ویرایش 8 بستر اجرای Java، متد می تواند داخل interface بدنه و پیاده سازی داشته باشد. اما برای این منظور لازم است آن متد را متد پیش فرض (با کلیدواژه ی default) تعریف کنیم. مثال:

فایل: TestInterfaceDefault.java

interface Drawable{  
void draw();  
default void msg(){System.out.println("default method");}  
}  
class Rectangle implements Drawable{  
public void draw(){System.out.println("drawing rectangle");}  
}  
class TestInterfaceDefault{  
public static void main(String args[]){  
Drawable d=new Rectangle();  
d.draw();  
d.msg();  
}}  

خروجی:

drawing rectangle
default method

امکان تعریف متد static در Interface در Java 8

از ویرایش 8 بستر اجرای Java، می توان داخل بدنه ی interface متد static داشته باشید. مثال:

فایل: TestInterfaceStatic.java

interface Drawable{  
void draw();  
static int cube(int x){return x*x*x;}  
}  
class Rectangle implements Drawable{  
public void draw(){System.out.println("drawing rectangle");}  
}   
class TestInterfaceStatic{  
public static void main(String args[]){  
Drawable d=new Rectangle();  
d.draw();  
System.out.println(Drawable.cube(3));  
}}  

خروجی:

drawing rectangle
27

Interface نام گذاری شده (marker interface یا tagged) چیست؟

interface ای که هیچ عضوی داخل بدنه ی خود نداشته باشد در اصطلاح جاوا tagged یا marker خوانده می شود. به عنوان مثال می توان به اینترفیس های Serializable، Cloneable، Remote و غیره ... اشاره کرد. interface های نام برده غالبا جهت ارائه ی اطلاعات اساسی به دستگاه مجازی جاوا (jvm) بکار برده شده و به آن امکان انجام عملیات معینی را می دهد.

//How Serializable interface is written?  
public interface Serializable{  
}  

Interface های تودرتو در جاوا

نکته:

در جاوا یک interface می تواند interface دیگری را داخل خود داشته باشد که در اصطلاح به آن interface های تودرتو گفته می شود. درباره این مفهوم در مبحث کلاس های تودرتو (nested classes) بیشتر توضیح خواهیم داد. در زیر یک مثال ساده جهت آشنایی شما ارائه شده است:

interface printable{  
 void print();  
 interface MessagePrintable{  
   void msg();  
 }  
}  
  • 6751
  •    1236
  • تاریخ ارسال :   1396/07/03

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .