PDA

View Full Version : سوال: برا چی باید از interface استفاده کرد؟



mazaher5723
پنج شنبه 15 فروردین 1392, 10:01 صبح
برا چی باید از interface استفاده کرد؟
اگه میشه ی مثال واضح بزنید تو همین سایت چندتا تاپیک خوندم متوجه نشدم

باتشکر مظاهر

Arcsinos
پنج شنبه 15 فروردین 1392, 10:34 صبح
با یه مثال خیلی ساده توضیح میدم

فکر کن شما یه اینتر فیس داری به اسم IToString و داخلش یه تابع به اسم String ToString تعریف کردی. حالا میخوای یه تابع دیگه بنویسی که ورودیش هرچی میخواد باشه ولی حتما باید تابعی به اسم String ToString داشته باشه برای این کار کافیه که یه تابع بنویسی که ورودیش اینترفیس IToString هست . مثلا( void MyFunc(IToString input . حالا این تابع هر کلاسی رو که interface IToString رو پیاده سازی یا به قولی Implementکرده باشه رو دریافت میکنه و از تابع ToString این کلاس استفاده میکنه و دیگه نگران این نیست که آیا این کلاس تابعی به اسم ToString داره یا نه.


//tarife interface----------------------------------------------------------
public inteface IToString
{
string ToString();
}
//tarife kelas avval ke IToString Ro piyade karde-----------------------------------
Class One:IToString
{
public string ToString()//hatman bayad in tabe neveshte beshe vagarna Compile Error khamim dasht
{
retrun "salam";
}
}
//tarife kelas dovvom ke IToString Ro piyade karde-----------------------------------
class Two:IToString
{
public string ToString()//hatman bayad in tabe neveshte beshe vagarna Compile Error khamim dasht
{
retrun "Hello";
}
}
//ye tabe ke voroodish IToString hast-----------------------------------
//albate nemishe az interface instance sakht----------------------------
public static void Show(IToString input)
{
Console.WriteLine(input.ToString());//input harchi bashe tabe ToString Ro dare
}
//estefade-----------------------------------------------------
public static void Main()
{
One myOne= new One();
Two myTwo= new Two();
Show(myOne);
Show(myTwo);
}
//inham khoroooji-----------------------------------------------
//salam
//Hello


این مثال رو تو Notepadنوشتم فکر نکنم اجرا بشه ولی چیزی که مهمه مفهوم Interface هست که به خوبی نمایانه.
موفق باشی

linux
پنج شنبه 15 فروردین 1392, 11:37 صبح
برا چی باید از interface استفاده کرد؟
اگه میشه ی مثال واضح بزنید تو همین سایت چندتا تاپیک خوندم متوجه نشدم
باتشکر مظاهر
مثال واضح:
فکر شما قرار است رادیو بسازید و بجز شما ۱۰ تا شرکت دیگر هم هستند که می خواهند رادیو بسازند بدهند دست مردم این وسط هر کسی می تونه هرجوری و هر شکلی که خواست بسازه ولی یک سازمانی به اسم موسسه استاندارد میاد وسط و می‌گه هر کی می خواهد رادیو بسازه باید روی رادیوش یک دکمه بگذارد برای خاموش و روشن شدن، یک دکمه بگذارد برای mute یک یک دکمه برای گشتن و پیدا کردن فرکانسها و ... و در مورد اینکه مثلا دکمه خاموش و روشن کردن چطوری کار می‌کنه حرفی نمی‌زند فقط میگه باید باشد. در سی‌شارپ هم همین هست. یعنی شما یکسری کلاس را مجبور می‌کنید از یک استانداری پیروی کنند.
روشن بود؟

tooraj_azizi_1035
پنج شنبه 15 فروردین 1392, 11:51 صبح
این مثال واقعاً عالی بود.

ordebehesht
پنج شنبه 15 فروردین 1392, 13:17 عصر
مثال واضح:
فکر شما قرار است رادیو بسازید و بجز شما ۱۰ تا شرکت دیگر هم هستند که می خواهند رادیو بسازند بدهند دست مردم این وسط هر کسی می تونه هرجوری و هر شکلی که خواست بسازه ولی یک سازمانی به اسم موسسه استاندارد میاد وسط و می‌گه هر کی می خواهد رادیو بسازه باید روی رادیوش یک دکمه بگذارد برای خاموش و روشن شدن، یک دکمه بگذارد برای mute یک یک دکمه برای گشتن و پیدا کردن فرکانسها و ... و در مورد اینکه مثلا دکمه خاموش و روشن کردن چطوری کار می‌کنه حرفی نمی‌زند فقط میگه باید باشد. در سی‌شارپ هم همین هست. یعنی شما یکسری کلاس را مجبور می‌کنید از یک استانداری پیروی کنند.
روشن بود؟

از مثالت خوشم آااومد

Mehdi Naderi
پنج شنبه 15 فروردین 1392, 15:46 عصر
با کمک اینترفیس شما یک کلاس رو مقید می کنید که حتما متدها و خاصیت هایی رو که شما مد نظرتونه رو داخل خودش داشته باشه متد و خاصیت مدنظرتون رو هم میذارین توی اینترفیس اما روش تعریف آن کمی متفاوت است و پیاده سازی ندارد.
به عنوان مثال :
اولا اینترفیس رو مثل کلاس تعریف میکنن مانند زیر



public interface MyInterface
{

 
}


بعد هم میای داخل ایترفیس متدهای و خاصیت های خودتو بدون Access Modifier بدون پیاده سازی تعریف میکنی



public interface MyInterface
}


void Function1();


string Function2();


void Function3(string StrName);


DateTime Function4(bool _status);
{


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






public class Class1 : MyInterface


{

 
}
کلا اینترفیس ها ابزارهای حالبی در دنیای برنامه نویسی هستند و بیشترین کاربرد آنها در SDK های شرکت هایی است که کامپوننت محصولاتشونو برای برنامه نویسان ارائه میکنند.

esafb52
جمعه 20 دی 1392, 00:23 صبح
http://stackoverflow.com/questions/15178219/whats-the-difference-between-an-abstract-class-and-an-interface
http://www.codeproject.com/Articles/11155/Abstract-Class-versus-Interface

nathan
یک شنبه 22 دی 1392, 22:14 عصر
یک سوال برای خود من هست چرا وقتی یک اینتر فیس رو داخل یک پیاده سازی می کنیم تمام متدها و ... به صورت public پیاده سازی می شن؟ راهی وجود نداره که بشه به صورت private پیاده سازیشون کرد؟

Mousavmousab
دوشنبه 23 دی 1392, 11:34 صبح
سلام
ببین دوست عزیز "nathan" : قرار است هر چی توی interface می نویسیم بدون بدنه باشه و فقط اسم تابع و تعداد آرگومان های ورودی تابع و نوع بازگشتی آن مشخص باشد و جا های دیگه بدنه ی تابع نوشته شود. اگر چنین تابعی را می شد به صورت Private بنویسیم. خوب دیگه توی کلاس های دیگه نمی توان از آن ها استفاده کرد. دیگه معنی نداشت ؟ درسته ؟ توی کلاس های از نوعAbstrac هم می توان به این صورت پیاده سازی کرد.

اما با هم یک فرق هایی دارند. مثلاٌ شما می تونی توی کلاس خودت که داری یک interface را Implement می کنی از بیش از یک Interface استفاده کنی ولی نمی تونی در کلاس خودت از بیش از یک کلاس دیگه ارث ببری که اون متد هاش را Implement کنی. درسته ؟
حیف وقت نیست (امتحانات ترم ولمون نمی کنه) وگرنه یک مثال ویدیویی می گذاشتم.

nathan
چهارشنبه 25 دی 1392, 12:06 عصر
سلام
ببین دوست عزیز "nathan" : قرار است هر چی توی interface می نویسیم بدون بدنه باشه و فقط اسم تابع و تعداد آرگومان های ورودی تابع و نوع بازگشتی آن مشخص باشد و جا های دیگه بدنه ی تابع نوشته شود. اگر چنین تابعی را می شد به صورت Private بنویسیم. خوب دیگه توی کلاس های دیگه نمی توان از آن ها استفاده کرد. دیگه معنی نداشت ؟ درسته ؟ توی کلاس های از نوعAbstrac هم می توان به این صورت پیاده سازی کرد.

اما با هم یک فرق هایی دارند. مثلاٌ شما می تونی توی کلاس خودت که داری یک interface را Implement می کنی از بیش از یک Interface استفاده کنی ولی نمی تونی در کلاس خودت از بیش از یک کلاس دیگه ارث ببری که اون متد هاش را Implement کنی. درسته ؟
حیف وقت نیست (امتحانات ترم ولمون نمی کنه) وگرنه یک مثال ویدیویی می گذاشتم.


ضمن عرض تشکر از بذل توجهتون فرمایشاتتون کاملاً صحیحه ولی نتونستم بفهمم چون میگم ما یک اینترفیس رو داریم در سطح یک کلاس پیاده سازی می کنیم ولی متدهای پیاده سازی شده به جای سطح دسترسی private به صورت اجباری public پیاده سازی می شن؟! خب من نیاز دارم متدهایی رو که تقریباً در هر فرمی تکرار می شن رو در یک انترفیس بیارم و با پیاده سازی اون در فرم حداقل از نوشتن دوباره اعلان اون متدها و خصوصیات راحت بشم وفقط کدهای لازم را داخل اون موارد بنویسم. برای حل این مشکل چه راه حلی پیشنهاد میشه و می خوام بدونم اگه این متدها به صورت public پیاده سازی بشن و با توجه به اینکه نیازی به عمومی بودن آنها نیست آیا در مسیر اجرای برنامه از نظر شی گرایی مشکلی ایجاد نمیشه؟
باز هم تشکر می کنم از تمام عزیزانی که وقت می ذارن

angoori
چهارشنبه 25 دی 1392, 14:38 عصر
راستش ما از اینترفیس برای فراخوانی توابع و اونت ها و ... ای استفاده میکنیم که عمومی هستن و شما نیاز دارین با استفاده از شی ایجاد شده اونها رو فراخانی کنین.
درواقع فکر کنین یه تابع برای رسم دارین که اسمش draw هست.شما یه شی از کلاسی که این تابع توش هست مثلا بیضی ایجاد میکنین تا یه بیضی برای شما رسم بشه( اگه این تابع public نباشه شما نمیتونین اون رو در خارج از کلاس و تو صفحه main فراخوانی کنین )
حالا شما چند تا شکل دیگه رو هم میخایین رسم کنین که همشون یه تابع draw دارن. اینجاست که بحث اینترفیس پیش میاد. درواقع لازم نیست شما برای هر کدوم یه شی جداگانه درست کنین و هر دفعه اون تابع draw رو فراخانی کنین. کافیه از شی پایه که میشه به اینترفیس cast اش کرد استفاده کنین.اینترفیس مربوطه خودش با توجه به نوع شی تابع draw مربوطه رو فراخوانی میکنه.