ورود

View Full Version : سوال: Interface



2java2
چهارشنبه 01 آبان 1392, 12:30 عصر
سلام دوستان
مطالب خیلی خیلی زیادی در رابطه با interface خوندم و حتی مثال های زیادی از حیوانات و امثال این رو هم دیدم که چطوری تو طبیعت عمل می کنه خیلی در موردش خوندم اما واسم ملموس نمی شه که کارش چیه اصلا؟؟؟!!
می گم وقتی ما تو متد سطح دسترسی داریم اینترفیس دیگه واسه چیه؟؟
احساس می کنم که تو برنامه نویسی شی گرا یا کلا پرژه های بزرگ خیلی خیلی کاربرد داره و در واقع یه نظمی به کار می ده اما دانسته هام فقط تو تئوری و در حد دونستن هنوز درکش نکردم .
اصلا چرا یک شی رو از جنس اینترفیس می گیرن بعد توش کلاس مورد نظر رو که این اینترفیس رو implement کرده توش new می کنن. خو از اول نوع شی رو از همون کلاس بگیر دیگه؟؟
کلا خیلی واسم مجهوله قضیه !!!
اگر کسی مثال خوبی داره که بتونه نشون بده که چرا از اینترفیس استفاده می کنن و "این که چه منافعی در ساز و کار اینترفیس ها وجود داره که ما ازش استفاده کنیم " یا اگر استفاده نکنیم چی میشه ...
با تشکر فراوان

cups_of_java
چهارشنبه 01 آبان 1392, 14:46 عصر
کارش چیه اصلا؟؟؟!!
اینترفیس کار اصلیش اینه که اجازه نمیده متد ها پیاده سازی بشن توش! یعنی شما رو مجبور می کنه متد هایی که توش تعریف می کنی همگی abstract باشن. خب این یعنی اینکه اینترفیس می تونه یه صندوق باشه برای تعریف مجرد یک سری متد!!! یعنی شما توش یک سری اسم تعریف می کنی و میگی هر کدوم چه ورودی ای میگرن و چی بر میگردونن (یعنی چکار می کنن)!
خب با این ابزار تو می تونی یه کتابخونه بسازی و بگی چه متد هایی داری و هر کدوم رو با چه ورودی هایی صدا کرد و دیگران که استفاده کنندگان این لایبرری هستن فقط همین رو می خوان بدونن نه چیز دیگه!!! پس کافیه اینترفیست رو بشناسن رو با همون کار کنن! بدون اینکه جزییات و یا روش پیاده سازی رو بدونن یا اسمی از متد ها و کلاس های داخلی کتابخونت بدونن!!! حالا که اینطوری شد! خیلی راحت می تونی در آینده جزییات داخلیه کتابخونت رو عوض کنی و هیچ استفاده کننده ای هم کدش عوض نشه! پس این شد یک کاربرد!!! (درست!؟) واسه همین میبینی که
احساس می کنم که تو برنامه نویسی شی گرا یا کلا پرژه های بزرگ خیلی خیلی کاربرد داره

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


اصلا چرا یک شی رو از جنس اینترفیس می گیرن بعد توش کلاس مورد نظر رو که این اینترفیس رو implement کرده توش new می کنن. خو از اول نوع شی رو از همون کلاس بگیر دیگه؟؟
الان چی گفتم؟ گفتم بدون اینکه کسی بفهمه بتونی...!!! این کار رو می کنن تا اینکه تو برنامه کدت (برنامه نویس) نفهمه که چی واقعن توی اون متغیره! و فقط ببینن تایپش از نوع اینترفیسه هست! حالا زمان new چه نوع و کدوم implementation توش قرار گرفته دیگه به اون لحظه استفاده از متغیر مربوط نیست! استفاده کننده فقط اینترفیس رو می بینه!!!! به این میگین یک شکل دیدن! هم شکل دیدن!‌ یکریختی!! یا همون همریختی که میشه polymorphism!
اصن این کاری که گفتی رو می کنن برای اینکه بتونن polymorphism استفاده کنن. بعضی خدایان شی گرایی میگن کدی که اینجوری نوشته نشده باشه اصن شی گرا نیست و شیگرایی به کلاس تعریف کردن نیست صرفن!!!
polymorphism یعنی اینکه بتونی چندین چیز از انواع مختلف رو یکی ببنی و یه جور باهاشون کار کنی در حالی که پیاده سازی ها و جزییات مختلفی دارن!



اگر کسی مثال خوبی داره که بتونه نشون بده که چرا از اینترفیس استفاده می کنن
مثال دنیای واقعیش تلوزیونه! دوس داشتی بجای این جعبه مشکی که دو تا دکمه روشن/خاموش و کم و زیاد کردن صدا داره یه مجموعه برد و مدارات الکترونیکی و سیم و صفحه رو جلوت میزاشتن و تو باید یه سری جزییات رو می دونستی و مراحلی رو میرفتی تا تلوزیون روشن میشد؟؟؟ اون باکس و چند تا دکمه اینترفیس تلوزیونی هستن که توش پر از پیچیدگی هاییه که تو نباید ببینی!

حالا گرفتی داستان چیه؟ یا نه؟

esmaeilbf
چهارشنبه 01 آبان 1392, 14:50 عصر
این فیلم رو که از جناب مهندس کیانیان هست ببین ، فکر نکنم دیگه ابهامی واست بمونه !
http://uplod.ir/hun6nx2l8t1a/interface.zip.htm

2java2
چهارشنبه 01 آبان 1392, 15:34 عصر
cups_of_java (http://barnamenevis.org/member.php?67212-cups_of_java) ممنون از این که وقت گذاشتی
خیلی کامل و جامع بود مرسی
فقط اگر یک کلاس از چند تا اینترفیس ارثبری کنه اون وقت دیگه نمی شه اون کلاس رو در یک اینترفیس نیو کرد در واقع اگر نیو بشه دیگه به متدهای اینترفیس های دیگه دسترسی نداریم
و یه چیز دیگه که تمام این کار هارو می شه با کلاس انجام داد و تنها فرقش که می گن همین ارثبری چند گانه است که از کلاس متمایزش کرده!!! در صورتی که اگر ارثبری چندگانه صورت بگیره اونوقت اتفاقی که بالا گفتم رخ می ده !!!!
آیا چنین رفتاری عادیه یعنی باید باشه شاید مضیت اینترفیس همین باشه که من نمی دونم ؟؟
____ در واقع می شه گفت که اینترفیس یک چیزی مثل GUI برای برنامه نویس می مونه برای دسترسی بهتر به کارایی کدها یا کتاب خونه ها درستهه؟؟؟!!!_____
یا اینکه میشه مقوله ی رویداد ها هم چنین باشه ؟؟؟
یه خورده مونده تا درک شهودی : )

cups_of_java
چهارشنبه 01 آبان 1392, 19:39 عصر
فقط اگر یک کلاس از چند تا اینترفیس ارثبری کنه اون وقت دیگه نمی شه اون کلاس رو در یک اینترفیس نیو کرد در واقع اگر نیو بشه دیگه به متدهای اینترفیس های دیگه دسترسی نداریم
قشنگیشم همین جاست. یعنی شما اینترفیس های مختلف جدا از همی می تونی داشته باشی که بسته به نیاز هر مشتری و هر شرایط به کار میاد و همه متد ها رو توی یه اینترفیس نزاشتی که همه همچیز رو ببینن!!! این همون تقسیم بندیه! محدودیت به جا و درستیه! مثل فولدر بندی اطلاعاتت! شما متد های مرتبط رو توی یه اینترفیس میزاری. و با ترکیب اینترفیس ها در ارث بری چندگانه می تونی به انواع ترکیب ها برسی. مثلن تو یه بازی فضایی که داره کد میشه شما اینترفیس پرواز داری، اینترفیس شلیک کردن هم داری. حالا یه شی جنگنده فضایی هم می تونه پرواز کنه هم می تونه شلیک کنه! پس هر جفت قابلیت ها رو به ارث میبره! (برای همین تو جاوا از اینترفیس خیلی به عنوان ویژگی و صفت و قابلیت و توانمندی یاد میکنن) این در حالیه که شما می تونی شی داشته باشی که شلیک کنه اما پرواز نکنه! یا می تونی پرواز کننده ای داشته باشی که شلیک نمی کنه...


یه چیز دیگه که تمام این کار هارو می شه با کلاس انجام داد
یه میخ رو با هر چیزی می تونی بکوبی اما درستش اینکه با چکشی مناسب خودش بکوبی



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



در واقع می شه گفت که اینترفیس یک چیزی مثل GUI برای برنامه نویس می مونه برای دسترسی بهتر به کارایی کدها یا کتاب خونه ها درستهه؟؟؟!!!
درسته


یه خورده مونده تا درک شهودی
دیگه اون وقتی بدست میاد که برای مدتی کد بنویسی و کدای معروف رو بخونی و کم کم حسش کنی خودت

2java2
چهارشنبه 01 آبان 1392, 23:38 عصر
درسته
ممنونم از وقتی که گذاشتی
دقیقا همینطوره باید کد بنویسم