PDA

View Full Version : دلیل استفاده از Interface و Abstract



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

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

cups_of_java
جمعه 07 فروردین 1388, 13:21 عصر
1- کلاس های مختلف که اون کلاس Interface رو implements میکنن باید همشون متود هایی که تو کلاس Interface هست رو داشته باشند، خب دلیل این کار چیه؟


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




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

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

mehdi_m1360
شنبه 08 فروردین 1388, 21:32 عصر
اگه یه کم راجع به patternهای مختلف مطالعه کنی ارزش اونا و البته کاربردشون رو درک میکنی.

syst3m_f4ult
چهارشنبه 12 فروردین 1388, 03:56 صبح
اگه یه کم راجع به patternهای مختلف مطالعه کنی ارزش اونا و البته کاربردشون رو درک میکنی.

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


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

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

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

mehdi_m1360
چهارشنبه 12 فروردین 1388, 19:48 عصر
موارد استفاده خیلی جدی تر از این حرفاست. در مورد 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
چهارشنبه 12 فروردین 1388, 22:56 عصر
Pattern ؟ ممنون میشم در موردش توضیح مخصر بدید.


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

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

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


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

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

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

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

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

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

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

Abalfazl
پنج شنبه 14 خرداد 1388, 14:51 عصر
توضیحات کامل درباره Abstract و interface و مقایسه بین اونها :

http://amir87.persiangig.com/document/JAVA%20OOP%20object%20class.pdf

http://estakhrian.blogfa.com/post-7.aspx
http://eleisure.blogspot.com/2009/01/java-abstract-class-and-interface.html
http://mindprod.com/jgloss/interfacevsabstract.html
http://www.javaworld.com/javaworld/javaqa/2001-04/03-qa-0420-abstract.html
http://www.javaworld.com/javaworld/javaqa/2001-08/03-qa-0831-interface.html

javaphantom
جمعه 15 خرداد 1388, 13:05 عصر
این چیزی که شما می گی ذاتن مفهوم 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 ها .

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

قله بلند
جمعه 27 آذر 1388, 17:32 عصر
با سلام
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
دوشنبه 22 خرداد 1391, 22:40 عصر
قبل از هر جیز باید مفهوم وراثت رو به درستی بشناسی. بعد باید بدونی Abstract مفهومش چیه! و این که Abstract Class چیه! یه کلاس رو Abstract (مجرد یا تجریدی) می گن اگه حداقل یک عملیات (متد) Abstract داشته باشه. وقتی عملیاتی رو Abstract می کنیم یعنی جزییات پیاده سازی اون متد رو نمی دونیم در کلاس کنونی و دوست داریم فرزندانش اون رو پیاده سازی کنند. پس متد مجرد بدنه نداره! و کلاس فرزند باید حتمن اون رو پیاده سازی کنه! وگرنه خود فرزند هم این متد رو مجرد به ارث می بره و میشه یک کلاس مجرد! طبیعی به نظر می رسه که از کلاس های مجرد نمی شه شی ایجاد کرد! (چرا؟)
خب حالا Interface یک کلاسی هست که تمام توابعش باید مجرد باشند! یعنی یک کلاس مجرد صرف! پس هر کی از یه Interface به ارث ببره متد های مجردی براش به ارث می رسه که باید اون ها رو پیاده سازی کنه!




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

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

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

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

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


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

spiderman200700
سه شنبه 23 خرداد 1391, 10:18 صبح
فیلم های این پست رو هم نگاه کنید. یکی از دوستان بسیار جالب توضیح داده.
http://barnamenevis.org/showthread.php?316580-%D9%81%DB%8C%D9%84%D9%85-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%DA%A9%D9%84%D8%A7%D8%B3%D9%87%D8%A7%DB%8C-%D8%A7%D9%86%D8%AA%D8%B2%D8%A7%D8%B9%DB%8C-%D9%88-%D9%85%D9%81%D9%87%D9%88%D9%85-%DA%86%D9%86%D8%AF%D8%B1%DB%8C%D8%AE%D8%AA%DB%8C-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C&p=1388984&viewfull=1#post1388984

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

reyhane71
چهارشنبه 06 بهمن 1395, 16:37 عصر
بسیار عالی بود متشکرم