PDA

نسخه کامل مشاهده نسخه کامل : سؤال راجع به interface در #C



CG_
20-05-2008, 12:26
سلام. لزوم استفاده از interface چیه؟ میشه یکم توضیح بدید؟ اصلاً این چیه؟ من هرچی خوندم نفهمیدم.
راستی vb.net و بقیه زبون های interface ، .Net دارن؟ اگر زحمتی نیست، فرق اون با interface ها در java هم بگید.
مرسی از توجهتون

khaiyam
20-05-2008, 20:15
هر زبونی که شی گرا باشه داره کاربرد اینترفیس در پلی مورفیسم مشخص می شه اگر میخوای بدونی باید مورفیسم را بخوانی

CG_
21-05-2008, 20:32
خیلی ممنون از لطفتون. حتماً دنبالش می رم.

Ultimator
22-05-2008, 12:01
با سلام
همانطور که می دانید C# از ارثبری های چند گانه پشتیبانی نمی کنه (ارثبری چندگانه به این منظور که یک کلاس از چندین کلاس ارث ببرد) ولی برای اینکه این ضعف را بپوشاند Interface ها را معرفی می کند. حال شاید بگویید چرا ضعف؟ ارثبری های چندگانه قدرتیست که نصیب C++ شده. ولی چرا این قدرت در C# نیست؟ مگر جد C# زبان C++ نیست؟
بله تمام این حرفها درست، ولی ارثبری های چندگانه باعث پیچیدگی خاصی می شه و شاید یکی از علتهای اینکه این قابلیت در C# نیست این هست که از پیچیدگی C# کاسته شود و زبانی ساده باشه.
.... اطلاعات بیشتر خواهیم کپی پیستاند !

mehdidelphi
23-05-2008, 00:49
interface یک قرارداد در نوع رفتار یک کلاس است.هر کلاس که از آن استفاده کند تضمین می کند که پیاده سازی تمام متدها و خاصیت ها و .. که در آن interface قرار دارد را در خود ایجاد کند .:46:

CG_
26-05-2008, 20:07
.... اطلاعات بیشتر خواهیم کپی پیستاند !


جسارتاً چی شد پس؟

Ultimator
29-05-2008, 01:11
حالا که عجله داری بیا مطلبی بدون هیچ گونه دخل و تصرف 100% کپی و پیست
میخواستم کاملش کنم اما فرصت نشد ..


اول یک مفهم پیاده سازی(Implement) رو توضیح دهم :
به طور مثال زمانی که ما متدی را ایجاد می کنیم و هیچ کدی در آن تا به حال ننوشته شده باشه را می گوییم این متد پیاده سازی نشده است، همچنین اگر کدی را در آن بنویسیم به اصطلاح می گوییم این متد پیاده سازی شده است.

interface ها همانند کلاس ها ایجاد می شوند با این تفاوت که به جای کلمه کلیدی class از interface استفاده می کنیم، ببینید :

کد:


public class MyClass {
}


public interface MyInterface {
}


ولی interface ها تفاوت عمده ای که با class ها دارند این هست که ما متد های کلاس را در خود کلاس پیاده سازی می کنیم ولی در interface نمی توانیم متد های آن را پیاده سازی کنیم.
دو تفاوت دیگر اینه که نمی توانیم access modifier یی همچون public، privateو ... نمی توانیم برای متد ها تعیین کنیم. تفاوت دیگر این است که در interface ها هیچ فیلدی (متغیری) نمی توانیم تعریف کنیم.
کلاس ها می توانند از حد اکثر یک کلاس دیگر ارث ببرند ولی می توانند از تعداد نا محدودی از interfaceها ارث ببرند. کاری که interfaceها انجام می دهند کلاسها را ملزم به پیاده سازی متدها و خاصیتهای(Properties) interfaceهای به ارث برده شده می کنند.
خوب حال بحث polymorphism را شروع می کنیم.
بگذارید مفهوم کلاس پایه و کلاس مشتق را با یک مثال توضیح دهم :

کد:

public class BaseClass {
}


public class DerivedClass : BaseClass {
}


خوب مثال بالا گویای همه چیز است و خود ناچیز پس نیازی به توضیح نداره.
زمانی که ما یک نمونه(Instance) از کلاس DerivedClass ایجاد می کنیم می توانیم آن را درون BaseClass بریزیم، منظورم را با یک مثال می گویم :

کد:
BaseClass MyBC = new DerivedClass();


دلیل اینکه ما می توانیم چنین کاری را انجام دهیم این است که کلاس مشتق تضمین می کنه که تمام خصوصیات کلاس پایه را داراست. (البته توجه داشته باشید که دیگر با نوشتن MyBC و با . دیگر به اعضای کلاس DerivedClass دسترسی نداریم و فقط به اعضای کلاس BaseClass دسترسی داریم (البته با روشهایی همچون type casting به اعضای DerivedClass کلاس دستری داشته باشیم.))
خوب حال چه ربطی به interfaceها دارد؟ (interfaceها را نیز می توان همانند کلاس بایه از آن ها استفاده کرد.)

به مثال زیر توجه کنید تا با interfaceها بیشتر آشنا شوید :
(بر اساس قانون اساسی C# ابتدای interfaceها را با حرف I بزرگ شروع می شود، البته این قانون تبصره هایی هم داره[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] .)

کد:

public interface IPrintable {
void Print();
}


public class MyClass1 : IPrintable {


#region IPrintable Members


public void Print() {
Console.WriteLine("MyClass1 print method called");
}


#endregion
}


public class MyClass2 : IPrintable {


#region IPrintable Members


public void Print() {
Console.WriteLine("MyClass2 print method called");
}


#endregion
}


متد زیر را به کلاس program اضافه می کنیم :
(چون interfaceیی که درست کردیم به نام IPrintable تضمین می کند که اشیایی که در آن قرار می گیرند دارای متد با نام Print هست می توانیم به شکل زیر عمل کنیم )

کد:

private static void PrintClassInfo(IPrintable prn) {
prn.Print();
}


حال در main برنامه (Console Application) را ببینید چگونه می توانیم از آن استفاده کنیم :

کد:

PrintClassInfo(new MyClass1());
Console.ReadLine();


PrintClassInfo(new MyClass2());
Console.ReadLine();


نکته ای که توجه کردن به آن مفید است اینه که زمانی که کلاسی را از interfaceیی ارث رفته می توانید روی آن interface کلیک کنید و سپس کلیدهای Shift + Alt + F10 را بزنید منویی باز می شود اولین گذینه آن را انتخاب کنید. می بینید که متدهایی که در آن interface بود در این کلاس نوشته می شوند و فقط باید آن را پیاده سازی کنید.
(در این نوشته بیشتر روی متد تکیه کرده بودم ولی همین موارد برای خاصیت ها هم صادق هست.)
می بینید که interface ها نقش بسیار مهمی را ایفا می کنند و ضعف ارثبری چندگانه را می پوشانند.