# فناوری جاوا > برنامه‌نویسی جاوا > Java SE : نگارش استاندارد جاوا >  دلیل استفاده از Interface و Abstract

## syst3m_f4ult

من الان چند ماه هست که جاوا میخونم و الان به Interface و Abstract رسیدم.
میخواستم بدونم دلیل استفاده این دو چی هست؟ بیشتر Interface دلیل استفادش برام مهم هست. چیزایی که خود من درک کردم از Interface این هست که :
1- کلاس های مختلف که اون کلاس Interface رو implements میکنن باید همشون متود هایی که تو کلاس Interface هست رو داشته باشند، خب دلیل این کار چیه؟ 
دلیلش فقط اینه که برنامه نویس یادش نره که حتما اون متود ها رو تو همه اون کلاس ها داشته باشه؟ 
لطفا دلایلی بیارید که قانعم کنه من هم از Interface استفاده کنم :)

(ببخشید کلمه های فارسی بعضی از کلمات رو بلد نیستم چون کتابی که میخونم فارسی نیست)

----------


## cups_of_java

> 1- کلاس های مختلف که اون کلاس Interface رو implements میکنن باید همشون متود هایی که تو کلاس Interface هست رو داشته باشند، خب دلیل این کار چیه؟


قبل از هر جیز باید مفهوم وراثت رو به درستی بشناسی. بعد باید بدونی Abstract مفهومش چیه! و این که Abstract Class چیه! یه کلاس رو Abstract (مجرد یا تجریدی) می گن اگه حداقل یک عملیات (متد) Abstract داشته باشه. وقتی عملیاتی رو Abstract می کنیم یعنی جزییات پیاده سازی اون متد رو نمی دونیم در کلاس کنونی و دوست داریم فرزندانش اون رو پیاده سازی کنند. پس متد مجرد بدنه نداره! و کلاس فرزند باید حتمن اون رو پیاده سازی کنه! وگرنه خود فرزند هم این متد رو مجرد به ارث می بره و میشه یک کلاس مجرد! طبیعی به نظر می رسه که از کلاس های مجرد نمی شه شی ایجاد کرد! (چرا؟)
خب حالا Interface یک کلاسی هست که تمام توابعش باید مجرد باشند! یعنی یک کلاس مجرد صرف! پس هر کی از یه Interface به ارث ببره متد های مجردی براش به ارث می رسه که باید اون ها رو پیاده سازی کنه! 



 لطفا دلایلی بیارید که قانعم کنه من هم از Interface استفاده کنم :)
طبق حرف های بالا Interface یه کلاس کاملن مجرد هستش! یعنی تمام متد هاش مجرد (Abstract) هستن. خب این یعنی چی؟ لغت Interface اصلن به معنی واسط (یا رابط) هستش. Interfaceها وسیله ای برای تعریف یک سری عملیات صرف هستند که جزییات اون عملیات رو مشخص نمی کنند. یعنی دارند مجموعه ای از متد ها تعریف می کنند که بعدن برنامه نویس ازشون استفاده می کنه (یعنی واسط بودن). 
برای اینکه درک کنی قضیه چیه مثال می زنم. لغت میوه رو در نظر بگیر. آیا میوه وجود خارچی داریم؟ جیزی به نام میوه داریم؟ نه خب! انواع میوه داریم. مثل موز، سیب، توت فرنگی، ... پس میوه چیه؟ میوه بک Interface برای نام گذاری و استفاده (واسط) از مجموعه همون خوردنی هاست. می گیم میوه رو می شه خورد! اگه خوردن یک متد باشه برای میوه. این متد مجرده! چرا؟ چون تو کلاس میوه نمی شه پیاده سازی کرد که میوه رو چه جوری می خورن. اما تو کلاس فرزندانش مثل سیب، پرتقال و ... میشه! چون پیاده سازی (نوع خوردن) هر کدوم از این انواع خاص میوه مشخصه!
باید مطالعه کنی و مثال بنویسی تا درکت قوی بشه! یه سوال هم من برات مطرح می کنم که جوابشو خودت پیدا کنی!
فرق بین Abstract Class و Interface چیه؟ کی از کدومشون استفاده کنیم؟

جواب قسمت آخر، دانش خوب از شی گرایی می خواد و لازمه که تجربه خوبی در این زمینه داشته باشی. (ضمنن پلی مورفیزم رو هم خوب یاد بگیر، به درک این مسائل کمک می کنه)

----------


## mehdi_m1360

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

----------


## syst3m_f4ult

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


Pattern ؟ ممنون میشم در موردش توضیح مخصر بدید.


این مثال میوه واقعا جالب بود و کامل تو ذهنم دیگه نشست کل قضیه رو، مرسی
و اینکه فرق Abstract و Interface :
اون چیزی که من فهمیدم این بود، لطفا تصحیح کنید و با کمال میل کامل کنید:

خب مثلا ما سه تا class داریم به اسمهای:
Database
CD
DVD
میخوایم سیدی و دیویدی ها رو تو دیتابیس ذخیره کنیم، خب خواهی نخواهی هردوی این کلاس ها یک سری متد خواهند داشت که کد تقریبا مشابه دارند (مثلا toString واسشون مینویسیم)، و یه سری متد دارند که اصلا شبیه یکدیگه نیستند، خب حالا واسه اینکه Duplication Code نشه، مثلا یه Abstract Class به اسم Item درست میکنیم و اون متدهایی که مثل هم هستند رو اونجا مینویسیم و Item رو تو database ذخیره میکنیم.

میدونم که یه جای توضیحام میلنگه =)

----------


## mehdi_m1360

موارد استفاده خیلی جدی تر از این حرفاست. در مورد patternها هم خودش یه دنیای جداست!

من یه مثال میزنم شاید به کارت بیاد.

میخوایم یه paint طراحی کنیم. تصاویر اصلی عبارت هستن از دایره، مستطیل، خط و نقطه. برای هرکدوم از اونا یه کلاس در نظر میگیریم. این کلاس ها همشون یه سری property دارن که معمولا منحصر به خودشونه مثل مختصات شکل، رنگ و کلفتی خط و غیره. همشون هم یه متد مشترک دارن برای رسم که کارای متفاوتی انجام میده. توی کلاس دایره، این متد دایره رسم میکنه و توی کلاس مستطیل، مستطیل.

همه این کلاسها از یه Interface ارث میبرن به اسم shape که فقط یه متد داره به نام draw. کلاس های پایینی برای رسم تصاویر مختلف اونو پیاده سازی میکنن.

توی این ارث بری نکته ای که وجود داره اینه که شما میتونین objectهاتونو که از انواع shape ها هستن به کلاس بالایی cast کنین. مثلا بنویسی
Shape s = new Rect(x,y,w,h,Color.black, Color.white)

و یا

Rect r = new Rect(x,y,w,h,Color.black, Color.white)
r.setLineWidth(5);
....
Shape s = r ;


میتونی توی برنامه تمام اشیا رو توی یه ساختار داده ای ذخیره کنی و بعدش به engine  بگی که اونا رو رسم کنه. engine از نوع اشیا خبر نداره و همه رو Shape فرض میکنه و متد draw رو صدا میزنه اما به تناسب اشیا مختلف؛ تصاویر متفاوت رسم میشه.

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

قسمت عمده ای از این الگوها هم با استفاده از همین Interfaceها و Abstract ها و همینطور مباحث مربوط به type casting پیاده میشن.

----------


## cups_of_java

> Pattern ؟ ممنون میشم در موردش توضیح مخصر بدید.
> 
> 
> این مثال میوه واقعا جالب بود و کامل تو ذهنم دیگه نشست کل قضیه رو، مرسی
> و اینکه فرق Abstract و Interface :
> اون چیزی که من فهمیدم این بود، لطفا تصحیح کنید و با کمال میل کامل کنید:
> 
> خب مثلا ما سه تا class داریم به اسمهای:
> Database
> ...



این چیزی که شما می گی ذاتن مفهوم Generalization هست که به طور خاص همون Inheritance می شه. فرق Abstract Class و Interface رو از نظر کاریردی اشاره نکردی. بیشتر فکر کن!

حرف های آقا مهدی هم در مورد Patternها متین و به جا هستش.

----------


## mazdadoost

> من الان چند ماه هست که جاوا میخونم و الان به Interface و Abstract رسیدم.
> میخواستم بدونم دلیل استفاده این دو چی هست؟ بیشتر Interface دلیل استفادش برام مهم هست. چیزایی که خود من درک کردم از Interface این هست که :
> 1- کلاس های مختلف که اون کلاس Interface رو implements میکنن باید همشون متود هایی که تو کلاس Interface هست رو داشته باشند، خب دلیل این کار چیه؟ 
> دلیلش فقط اینه که برنامه نویس یادش نره که حتما اون متود ها رو تو همه اون کلاس ها داشته باشه؟ 
> لطفا دلایلی بیارید که قانعم کنه من هم از Interface استفاده کنم :)
> 
> (ببخشید کلمه های فارسی بعضی از کلمات رو بلد نیستم چون کتابی که میخونم فارسی نیست)


جواب این سوال رو می تونید با کسب تجربه و افزایش نیازهاتون به شکل عملی تجربه کنید.
به طور خیلی خلاصه :
وقتی کاملا از رفتار و خواص شی مورد نظرتون مطلعید از کلاس استفاده کنید .
وقتی از رفتار شی مورد نظرتون آگاهید اما شیوه اون رفتار براتون واضح نیست از واسط ها استفاده کنید.
وقتی بعضی از رفتار ها براتون مشخص و بعضی نامشخص هستن از کلاس های مجرد استفاده کنید .
شما میتونید وراثت چند گانه رو با Coposition در جاوا با کلاس ها ایجاد کنید .اما این به قیمت مصرف Ram بیشتر تمام میشه . همون کار رو با مصرف رم خیلی کمتر میتونید با اینترفیس ها انجام بدین. 
اگر میخواید یک API توسعه بدین بهترین دوستان شما کلاس های مجرد و اینتر فیس ها هستن.
یه نکته خیلی مهم : خیلی سعی نکیند برنامتون رو به شکل شی گرای محض تجسم کنید . ببینید چطور میتونید مشکلتون رو حل کنید .
موفق باشید.

----------


## cups_of_java

> جواب این سوال رو می تونید با کسب تجربه و افزایش نیازهاتون به شکل عملی تجربه کنید.
> به طور خیلی خلاصه :
> وقتی کاملا از رفتار و خواص شی مورد نظرتون مطلعید از کلاس استفاده کنید .
> وقتی از رفتار شی مورد نظرتون آگاهید اما شیوه اون رفتار براتون واضح نیست از واسط ها استفاده کنید.
> وقتی بعضی از رفتار ها براتون مشخص و بعضی نامشخص هستن از کلاس های مجرد استفاده کنید .
> شما میتونید وراثت چند گانه رو با Coposition در جاوا با کلاس ها ایجاد کنید .اما این به قیمت مصرف Ram بیشتر تمام میشه . همون کار رو با مصرف رم خیلی کمتر میتونید با اینترفیس ها انجام بدین. 
> اگر میخواید یک API توسعه بدین بهترین دوستان شما کلاس های مجرد و اینتر فیس ها هستن.
> یه نکته خیلی مهم : خیلی سعی نکیند برنامتون رو به شکل شی گرای محض تجسم کنید . ببینید چطور میتونید مشکلتون رو حل کنید .
> موفق باشید.


درسته اما معیار انتخاب بین این دو همیشه اینقدر واضح نیست. اصولن توصیه می شه در قدم اول از Interface استفاده کنید. موجود دوست داشتنی تریه چون کاملن واسط رفتار رو در اختیار می ذاره بدون هیچ جزییاتی از چگونگی انجام اون. پس تر تمیز و منعطف تره! اما در عمل دلایلی عمومن در طراحی شی گرا باعث می شن که Interfaceها به کلاس های مجرد تبدیل بشن و ما از Abstract Classها استفاده کنیم. (مثل رفتار های با پیاده سازی مشترک بین فرزندان یک Interfaceو...) توجه کنید که Interface به شما امکان وراثت چندگانه (در جاوا) می ده ولی Abstract Class نمیده. در پیاده سازی Interface سلیقه دست خود پیاده سازه اما در پیاده سازی (وراثت از) کلاس های مجرد خصوصیات و رفتارهای پیاده سازی شده اون کلاس هم در اختیار برنامه نویس قرار می گیره و...

کلن اینطوری فکر کن که ما Interface داریم و کلاس عادی. اگه نتونی از Interface استفاده کنی و کلاست هم عادی نباشه و رفتاری داشته باشی که پیاده سازیشو اون موقع نمی دونی از Abstract Class استفاده کن.

----------


## Abalfazl

توضیحات کامل درباره  Abstract  و interface و مقایسه بین اونها :

http://amir87.persiangig.com/documen...ct%20class.pdf

http://estakhrian.blogfa.com/post-7.aspx
http://eleisure.blogspot.com/2009/01...interface.html
http://mindprod.com/jgloss/interfacevsabstract.html
http://www.javaworld.com/javaworld/j...-abstract.html
http://www.javaworld.com/javaworld/j...interface.html

----------


## javaphantom

> این چیزی که شما می گی ذاتن مفهوم Generalization هست که به طور خاص همون Inheritance می شه. فرق Abstract Class و Interface رو از نظر کاریردی اشاره نکردی. بیشتر فکر کن!
> 
> حرف های آقا مهدی هم در مورد Patternها متین و به جا هستش.



interface هر موقع که بخواهیم رفتارهایی رو به یک کلاس تحمیل کنیم از interface استفاده می کنیم. تعریف interface همینه. یعنی اینکه یک کلاس وقتی از یک  inteface استفاده کرد باید تمام method های اون رو Implement یا پیاده سازی کنه.

تفاوت Interface با یک abstract class
تمام method های یک Interface بصورت abstract هستند ولی در abstract کلاس می تواند چنین نباشد.
abstract کلاس دارای constructor هست ولی Interface نیست.
وراثت چند گانه در abstract کلاس ها نیست ولی در interface هست.

شباهت: هر دو غیر قابل Instance یا همان new شدن هستند.

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

حل مشکل وراثت چندگانه در java بر خلاف C++‎

مثال یک کلاس abstract حیوانات در نظر بگیرید و همچنین دو کلاس  خر و  قورباغه که هر دو از این کلاس پدر که مثلا شامل دو method حرف زدن و راه رفتن هست ارث بردند. خب معلومه خر ار ار می کنه و چهار دست و پا راه می ره و قورباغه  قور قور می کنه  و می جهه حالا کلاس آدم رو در نظر بگیر که خودش زیر مجموعه کلاس حیوان هست بیاد و از دو کلاس خر و قورباغه ارث بری کنه یعنی وراثت چند گانه که در ++C هست و خیلی ها فکر می کنند خیلی خوبه.
نتیجه دو متد راه رفتن و حرف زدن در هر دو کلاس پدر برای آدم به دو جور متفاوت تعریف شده حالا آدم چهار دست و پا راه می ره یا می جهه آدم باید ار ار کنه یا قور قور ؟

راه حل وجود interface هست که می تونه این مشکل رو حل کنه چرا چون تمام متدود های تعریف شده در اون دارای تعریف هیچ رفتاری نیست یعنی وجود رفتار هست  و چگونگی اون معلوم نیست پس می توان برای هر کلاس بصورت مجزا تعریف بشه.

مثال بعدی رو با این شروع می کنم که فرض کنید که یک interface دارید که تعریف عمل پرواز توش وجود داره اما چون چگونگی این عمل تعریف نشده خیلی راحت کلاس هواپیما و کلاس مگس می تونند از این Interface استفاده کنند و عمل پرواز رو برای خودشون تعریف کنند.

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

نکته: در زبان جاوا هر کلاس یا کلاس هایی که از یک یا چند Interface استفاده کرده باشند این خاصیت رو بصورت runtime به ما می ده که بجای اینکه از خود نوع کلاس یک instance داشته باشیم از خود کلاس و از نوع Interface اون یک instance داشته باشیم که بسیار کاربردی هست

مثال
public interface Animals {
public void talk();
public void walk();
}

public class Human implements Animals {
public void talk() {
System.out.println("like a human");
}
public void walk() {
System.out.println("like a human");
}

public class Donkey implements Animals {
public void talk() {
System.out.println("like a donkey");
}
public void walk() {
System.out.println("like a donkey");
}

نکته در چگونگی استفاده از آن
public class Use {
public static void main(String[] st) {
Animals human = new Human();
human.talk();
Animals donkey = new Donkey();
donkey.walk();
}
}


سوال: بابا باز این چه کاریه خوب از همون اول می نوشتیم داستان رو دیگه بصورت جدا و بعدشم بصورت جدا از interface می اومدیم instance می گرفتیم مثل آدم.

جواب: یک ضبط ماشین رو در نظر بگیرید همراه با face اون ضبط.
آیا شما که در ماشنتون نشستید هیچ اطلاعایی از چگونگی پیاده سازی ضبط ماشینتون دارید؟
مثالا می تونید از چندتا ترانزیستور و و و درست شده ؟ معلومه که نه ولی یک face دارید که روی اون face چند تا دکمه هست که وقتی اون دکمه ها رو می زنید یک سری فرامین اجرا می شه مثلا می خونه یا جلو یا به عقب بر می گرده  مهم داستان اینکه که اگر شما پشت قضیه رو عوض کنی داستان باز با این face کار می کنه مثلا شرکت X یک جور طراحی می کنه با این face و شرکت Y یک جور دیگه ولی شما چون با این face کار می کنید متوجه او پشت نمی شید.
جریان Interface هم به این حالته برای شما، در مثال من دیدین که شما فقط کافی هست که Interface رو داشته باشید و اون وقت بصورت مختلف از این Interface نتیجه های گوناگون بگیرید.

کلی کاربرد دیدید که می شه از Interface و کلا بحث abstraction استفاده کرد.

اگر دیدتون بصورت  componentی باشه تا objectی اون موقع کلی بحث هست برای این موضوع.

اما مهمترین قسمت و پر کاربرد ترین قسمت بحث dependency injection هست که باز بر می گرده به بحث component ها و service ها .

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

----------


## قله بلند

با سلام
javaphantom عزیز، ضمن تشکر از توضیحات پست قبلی، از شما یا از دوستان دیگر تقاضا می کنم به چند سوال پیرامون واسط ها پاسخ دهید.
سوال اول: اگر لطف کنید و بیشتر راجع به عملیاتی که در قطعه کد زیر اتفاق می افتد توضیح دهید ممنون می شوم. هنوز درک درستی از اینگونه نوشتن ندارم.Animals human = new Human();سوال دوم: آیا اینگونه نوشتن تولید سربار یا پردازش اضافی برای کامپایلر ر بر ندارد؟ چون هم از اسم واسط استفاده می کنید و هم از نام کلاسی که واسط را پیاده سازی می کند.
سوال سوم: اگر من یک تابع اضافی در کلاس Human، اضافه کنم دیگر نمی توانم با آدرسی که human در اختیار من می گذارد به آن دسترسی پیدا کنم. یعنی باید از خود کلاس Human تولید شیء کنم. پس تولید چنین آدرسی به این شیوه چه مزیتی دارد؟Animals human = new Human();در قطعه کد زیر نیز وقتی از سطح دسترسی public استفاده کردم، پیغام خطا صادر شد مبنی بر اینکه باید واسط Animals در یک بسته با نام Animals تعریف شود. وقتی حالت عمومی را برداشتم مشکل حل شد.public interface Animals {public void talk();public void walk();}

----------


## yegane8

> قبل از هر جیز باید مفهوم وراثت رو به درستی بشناسی. بعد باید بدونی Abstract مفهومش چیه! و این که Abstract Class چیه! یه کلاس رو Abstract (مجرد یا تجریدی) می گن اگه حداقل یک عملیات (متد) Abstract داشته باشه. وقتی عملیاتی رو Abstract می کنیم یعنی جزییات پیاده سازی اون متد رو نمی دونیم در کلاس کنونی و دوست داریم فرزندانش اون رو پیاده سازی کنند. پس متد مجرد بدنه نداره! و کلاس فرزند باید حتمن اون رو پیاده سازی کنه! وگرنه خود فرزند هم این متد رو مجرد به ارث می بره و میشه یک کلاس مجرد! طبیعی به نظر می رسه که از کلاس های مجرد نمی شه شی ایجاد کرد! (چرا؟)
> خب حالا Interface یک کلاسی هست که تمام توابعش باید مجرد باشند! یعنی یک کلاس مجرد صرف! پس هر کی از یه Interface به ارث ببره متد های مجردی براش به ارث می رسه که باید اون ها رو پیاده سازی کنه! 
> 
> 
> 
>  لطفا دلایلی بیارید که قانعم کنه من هم از Interface استفاده کنم :)
> طبق حرف های بالا Interface یه کلاس کاملن مجرد هستش! یعنی تمام متد هاش مجرد (Abstract) هستن. خب این یعنی چی؟ لغت Interface اصلن به معنی واسط (یا رابط) هستش. Interfaceها وسیله ای برای تعریف یک سری عملیات صرف هستند که جزییات اون عملیات رو مشخص نمی کنند. یعنی دارند مجموعه ای از متد ها تعریف می کنند که بعدن برنامه نویس ازشون استفاده می کنه (یعنی واسط بودن). 
> برای اینکه درک کنی قضیه چیه مثال می زنم. لغت میوه رو در نظر بگیر. آیا میوه وجود خارچی داریم؟ جیزی به نام میوه داریم؟ نه خب! انواع میوه داریم. مثل موز، سیب، توت فرنگی، ... پس میوه چیه؟ میوه بک Interface برای نام گذاری و استفاده (واسط) از مجموعه همون خوردنی هاست. می گیم میوه رو می شه خورد! اگه خوردن یک متد باشه برای میوه. این متد مجرده! چرا؟ چون تو کلاس میوه نمی شه پیاده سازی کرد که میوه رو چه جوری می خورن. اما تو کلاس فرزندانش مثل سیب، پرتقال و ... میشه! چون پیاده سازی (نوع خوردن) هر کدوم از این انواع خاص میوه مشخصه!
> باید مطالعه کنی و مثال بنویسی تا درکت قوی بشه! یه سوال هم من برات مطرح می کنم که جوابشو خودت پیدا کنی!
> ...


من با توجه به توضیحات فکر کنم فرق abstract class با interface اینه که تو abstract class فقط چند تا از متد‌ها abstract اند اما تو interface  همهٔ متد‌ها باید abstract باشن درست میگم؟

----------


## p_ooya

توی کتاب Thinking in java این مسئله خیلی زیبا توضیح داده شده. Abstract به شما اجازه میده که برای ساختار وراثتی کلاستون یک چهارچوب تعریف کنید. مثلاً شما یک کلاس انتزاعی دارید به اسم ساز! در این کلاس یک متد انتزاعی به اسم نواختن دارید و یک متد دیگه به اسم کوک کردن. همونطور که می بینید پیاده سازی این متدها در کلاس ساز عملی نیست و در زیر کلاس ها انجام میشه (مثلاً کلاس تار). فایده ایجاد کلاس انتزاعی ساز این هست که یک چهارچوب رو برای زیر کلاس ها فراهم میکنه:
تصویر:
http://www.linuxtopia.org/online_boo...ava/TIJ316.png

اینترفیس‌ها این انتزاع رو یک درجه بالاتر می‌بردند! به عبارت دیگه اینترفیس از کلاس ابسترکت هم ابسترکت تر هست! در اینترفیس ما میگیم که این کلاس باید «این شکلی» باشه و بیش از این درگیر جزئيات نمیشیم.




> An interface says, "All classes that implement this particular interface will look like this."

----------


## spiderman200700

فیلم های این پست رو هم نگاه کنید. یکی از دوستان بسیار جالب توضیح داده. 
https://barnamenevis.org/showthread.p...=1#post1388984

----------


## ehsan_68

من جوابای دوستانو کامل نخوندم، ولی استفاده های عملی ای که خودم دیدم، یکی مبحث Dependency Inversion هست که اصلا بر پایه مفهوم Interface بنا شده.
یکی هم اینه که امکان Multiple Inheritance رو به جاوا می ده. می دونید که به خاطر مشکلاتی که داره ، جاوا به طور کلی MI رو پشتیبانی نمی کنه.
نکته ای که هست اینه که Interface فقط یک Keyword نیست بلکه یکی از مفاهیم شی گراس که توی تمام زبان‏های شی گرا باید وجود داشته باشه. مثلا C++‎ هم یه همچین قابلیتی داره ولی بدون Keyword اینترفیس.

----------


## reyhane71

بسیار عالی بود متشکرم

----------

