مشخصات مقاله
-
2608
-
0.0
-
15506
-
0
-
0
آموزش کار با interface در Java
آموزش Java – کار با interface در جاوا
interface در جاوا مانند یک الگو یا نقشه برای کلاس می باشد. این ساختار دارای ثوابت static و متدهای بدون بدنه (abstract) می باشد. به عبارت دیگر interface مکانیزمی برای پیاده سازی مفهوم انتزاع (abstraction) در برنامه نویسی می باشد. لازم به ذکر است که داخل interface توسعه دهنده می تواند فقط متدهای abstract و بدون بدنه تعریف کند.
کاربرد اصلی interface در جاوا در فراهم کردن زمینه ای برای پیاده سازی مفهوم abstraction و وراثت چندگانه (multiple inheritance) خلاصه می شود.
interface در جاوا همچنین نشانگر رابطه ی IS-A می باشد. مانند کلاس های abstract امکان نمونه سازی (instantiation) از روی interface وجود دارد.
دلایل استفاده از interface در جاوا
سه دلیل اصلی برای استفاده interface به شرح زیر می باشند:
- پیاده سازی مفهوم abstraction در نوشتن برنامه
- پیاده سازی قابلیت وراثت چندگانه یا multiple inheritance در جاوا
- پیاده سازی مفهوم loose coupling و کاستن وابستگی آبجکت ها به هم در اپلیکیشن
بهبود interface در ویرایش 8 Java
از ویرایش 8 زبان Java، interface می تواند متدهای پیش فرض و static داشته باشد که بعدا درباره ی آن ها بحث خواهیم کرد.
کامپایلر جاوا کلیدواژگان public و abstract را به صورت پیش فرض قبل از اسم متد اعلان شده در بدنه ی interface اضافه می کند. همچنین قبل از متغیرها و فیلدهای داده ای آن، کلیدواژگان public، static و final را درج می نماید.
به عبارت دیگر، فیلدهای interface به صورت پیش فرض public، static و final هستند و متدهای تعریف شده در بدنه ی آن public و abstract می باشند.
فهم رابطه ی کلاس و interface
¬همان طور که در تصویر زیر مشاهده می کنید، کلاس از کلاس دیگری ارث بری می کند، یک interface نیز می تواند از interface دیگری ارث بری داشته باشد اما کلاس interface را با کلیدواژه ی implement در بدنه ی خود پیاده سازی می کند.
مثال ساده ای از 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 یا وراثت چندگانه گویند.
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();
}
}