# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ > سوال: Interface چیست؟

## YourWorldToday

با سلام خدمت دوستان برنامه نویس عزیز
یه چند مدت هستش که وقتی مقالاتی در مورد C#‎ می خونم به عبارت Interface بر می خورم. این سوال برام مطرح شده که این اینترفیس چی هست. تو سایتMSDN دنبالش گشتم ولی از انجای که انگلیسم خوب نیست چی متوجه نشدم
حالا از دوستان گرامی که در ضمینه این مطلب اطلاعات دارند خواهش می کنم در این مورد توضیحاتی بفرمایند -  اگر امکان داره با مثال و نمونه کد 
با تشکر

----------


## teardrop

به نام خدا

فکر کن که چند کلاس مجزا داریم یعنی اینکه *از هم* چیزی به ارث نبردند(به جز اینترفیس آن هم برای تشخیص تعریف اجباری است کلاس ها در سی شارپ وراثت چند گانه را ندارد به جز سی پلاس پلاس) و میخواهیم در تمامی کلاسها یک یا چند متد را به *اچبار* میخواهیم بازنویسی کنیم(اشتباه با virtual نگیر)که هر کدام کار مخصوص خود را انجام میدهند.
در کلاس اینترفیس نام متد اجباری بدونه اینکه کدی نوشته شود(بلاک باز و بسته) را مینویسم.
Public interface MyInterface
{
void sampleMethod();
}
و در همه ی کلاس ها که از اینترفیس به ارث میبرند متد سمپل را برای هر کدام مینویسیم که هر کدام کد مخصوص به خود را دارد
Public class Myclass:MyInterface
{
void sampleMethod()
{
//code
}
}

طرز استفاده:البته با foreche هم میتوان استفاده کرد.


MyInterface obj1=new *Myclass*();
MyInterface obj2=new Myclass2();
obj1.sampleMethod();
obj2.sampleMethod();

//end

مثال دنیای واقعی:یک *در* داریم که به چند روش قابل *باز* شدن هست که به این چند ریختی گویند.


موفق باشی

----------


## Open-Source

معنی Interface میشه رابط.
توی عباراتی که شما با اون سروکار دارید Interface اشاره میکنه به همون User Interface یعنی رابط کاربر.
مثلا رابط کاربر توی محیط داس متن بود و توی ویندوز پنجره هستش.
درکل یعنی اون محیطی که کاربر باهاش کار میکنه وسر و کار داره.

----------


## L u k e

خوب با کلاس هم می شه اینکارو کرد یه کلاس مرجع در نظر می گیریم و بقیه رو وارث
چه فرقی دارن ؟

----------


## mohamad.zakery

یکی از ویژگی های سه گانه اصلی برنامه نویسی شی گرا چند ریختی است  و همچنین در زبان های شی گرای کلاسیکی مانند ++C امکانی بنام  وراثت چند گانه موجود بود که در C#‎‎ موجود نیست همه و همه ی این ها در زبان C#‎‎ با مفهومی بنام اینترفیس پیاده سازی میشوند.

----------


## s.khoshfekran

interface مثل یه قرار داد میمونه که کلاس هایی که ازش به ارث می برند باید اونا را پیاده سازی کنند.و احتیاجی به پیاده سازی متدها و ... در داخل اینترفیس نیست. چند کاربرد برای اینترفیس: 
1) interface as Services: مثلا" وقتی می خوای یه آرایه از جنس رشته رو sort کنی از IComparable استفاده می کنه و sort رو انجام میده ولی اگه بخوای یک آرایه از یک کلاس مثلا person رو sort کنی نمیذونه که نسبت به کدوم خاصیت Person باید مرتب کنه ولی وقتی شما Icomparable رو براش پیاده سازی کنی میتونی تعریف کنی که مثلا بر اساس سن Person مرتب سازی انجام بشه
2) interface as multiinherince: در کلاس ها فقط از یک کلاس میتونی ارث بری کنی ولی با پیادهسازی اینترفیس میتونی از ارث بری چندگانه بهره ببری!!
و.....

----------


## cardano7

سلام
امیدوارم این پست کمک کنه:
http://www.barnamenevis.org/sh...205#post982205

----------


## اَرژنگ

> یکی از ویژگی های سه گانه اصلی برنامه نویسی شی گرا چند ریختی است و همچنین در زبان های شی گرای کلاسیکی مانند ++C امکانی بنام وراثت چند گانه موجود بود که در C#‎‎‎ موجود نیست همه و همه ی این ها در زبان C#‎‎‎ با مفهومی بنام اینترفیس پیاده سازی میشوند.


این یک دید کاملاً اشتباه است در http://www.barnamenevis.org/sh...425#post998425
توضیح دادم.

----------


## اَرژنگ

> معنی Interface میشه رابط.
> توی عباراتی که شما با اون سروکار دارید Interface اشاره میکنه به همون User Interface یعنی رابط کاربر.
> مثلا رابط کاربر توی محیط داس متن بود و توی ویندوز پنجره هستش.
> درکل یعنی اون محیطی که کاربر باهاش کار میکنه وسر و کار داره.


 با سلام به دوست قدیمی، 
اگرچه چیزی که شما میگید کاملاً درست است، اینها دنبال اون یکی اینترفیس هستند: http://msdn.microsoft.com/en-us/libr...5b(VS.80).aspx

----------


## mehdikhazaei

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

----------


## اَرژنگ

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


این یک دید کاملاً اشتباه است در http://www.barnamenevis.org/sh...425#post998425
توضیح دادم.

----------


## chapdastetanha2

> معنی Interface میشه رابط.
> توی عباراتی که شما با اون سروکار دارید Interface اشاره میکنه به همون User Interface یعنی رابط کاربر.
> مثلا رابط کاربر توی محیط داس متن بود و توی ویندوز پنجره هستش.
> درکل یعنی اون محیطی که کاربر باهاش کار میکنه وسر و کار داره.


برادر من حتما باید پست بذاری؟
ملت به این حرفت می خندن خب.

----------


## tooraj_azizi_1035

سلام
یک interface تنها حاوی امضای (signature) متدها، delegate ها و event هاست. پیاده سازی یا implementation اونها همونطور که در مثال زیر می بینید در کلاسی که از این اینترفیس مشتق می شوند انجام میگیرد. 


      interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation: 
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }

    static void Main()
    {
        // Declare an interface instance.
        ISampleInterface obj = new ImplementationClass();

        // Call the member.
        obj.SampleMethod();
    }
}


یک interface می تواند عضوی از یک فضای نام یا کلاس باشد و می تواند حاوی امضای (منظور Header تابع یا هر چیز دیگر است) یکی از این موارد باشد:


 Methods Properties Indexers Events

یک interface می تواند از یک یا بیش از یک interface پایه مشتق شود. هنگامی که در مقابل : لیست کلاس ها و interfaceهای پایه یا base لیست می شود نام کلاس باید قبل از نام interface قرار گیرد.

کلاسی که یک interfaceرا پیاده سازی می کند می تواند علناً اعضای interface را پیاده سازی کند. عضوی که به شکل علنی پیاده سازی شده نمی تواند از طریق یک نمونه ایجاد شده از کلاس مورد دستیابی قرار گیرد بلکه تنها از طریق نمونه ایجاد شده از روی interfaceمی توان به آن دست پیدا کرد:



      // keyword_interface_2.cs
// Interface implementation
using System;
interface IPoint
{
   // Property signatures:
   int x
   {
      get;
      set;
   }

   int y
   {
      get;
      set;
   }
}

class Point : IPoint
{
   // Fields:
   private int _x;
   private int _y;

   // Constructor:
   public Point(int x, int y)
   {
      _x = x;
      _y = y;
   }

   // Property implementation:
   public int x
   {
      get
      {
         return _x;
      }

      set
      {
         _x = value;
      }
   }

   public int y
   {
      get
      {
         return _y;
      }
      set
      {
         _y = value;
      }
   }
}

class MainClass
{
   static void PrintPoint(IPoint p)
   {
      Console.WriteLine("x={0}, y={1}", p.x, p.y);
   }

   static void Main()
   {
      Point p = new Point(2, 3);
      Console.Write("My Point: ");
      PrintPoint(p);
   }
}

Output
 

My Point: x=2, y=3

----------


## alireza.zahani

اینترفیس قراردادی است که تولید کننده یک کلاس خود را ملزم به رعایت آن میداند این قرار داد signature اعضای public کلاس شامل متدها رخدادها و خصوصیات کلاس را مشخص میکند


اما اینکه اینترفیس چه کاربردی دارد بحث گسترده ای است که کاملا با مباحث design pattern همراه خواهد بودو بسیار فراتر از توضیح در یک یا چند پست میگردد ، اینترفیس از ارکان اصلی تولید برنامه به روش شی گراست و بدون آن برنامه نویسی بر اساس اصول oo ناممکن است


از آنجائیکه ایده اصلی مدل شی گرایی برگرفته از زندگی روزمره انسان و ارتباطات موجود در آن است بهترین مثال را میتوان از همین واقعیات انتخاب کرد.


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

در مبحث نرم افزار و در طراحی و پیاده سازی به روش شی گرایی هم اینترفیس همان مقدار اهمیت دارد که در زندگی روزمره اما اینکه ما استفاده نمیکنیم مبحثی جداست ، ساده ترین و دم دست ترین مثال نرم افزاری که میتوانم ذکر کنم همین متد Dispose است که بارها از آن استفاده کرده ایم ، استفاده ای که از این متد میکنیم این است که منابع unmanaged را در آن release میکنیم . اما اینکه این متد کی و چگونه فراخوانی میشود موضوعی است که ما را با کاربرد اینترفیس آشنا میکند. در دات نت منابع managed به وسیله gc آزاد میشوندو آزاد سازی سایر منابع به عهده برنامه نویس است . وقتی gc میخواهد یک شی را از حافظه پاک کند ابتدا بررسی میکند تا ببیند آیا این شی از نوع کلاسی است که اینترفیس IDisposable را پیاده سازی کرده است یا خیر در صورتی که جواب مثبت بود gc متوجه میشود که این شی احتمالا منابع unmanage ای را هم در اختیار گرفته که آنها نیز باید آزاد شوند و از آنجا که با اینترفیس IDisposable آشناست میداند این کلاس یک متد عمومی به صورت void Dispose دارد و با فراخوانی آن تمام منابع unmanage را آزاد خواهد کرد. این سلسله کارها به این دلیل با موفقیت صورت گرفت که هم تولید کننده کلاس ومصرف کننده آن(gc) با هم در مورد اینترفیس IDisposable توافق کرده اند . از این مثالها در خود محیط دات نت و ابزار ویژوال استودیو فراوان است. در مورد برنامه هایی که ما تولید میکنیم هم در صورت استفاده صحیح در کد نویسی و البته بینش صحیح در فاز طراحی بی اندازه مفید است و در صورت استفاده نادرست جز گرفتاری و زیاد شدن زمان پیاده سازی هیچ خاصیت دیگری ندارد اگر مثال کاربردی تری خواستید بگویید تا ذکر کنم

----------


## alireza.zahani

*مقایسه Interface و Abstract Class و زمان استفاده از آنها* 



برای شروع بحث در ابتدا به تعریف هر یک از دو عنصر ذکر شده و عملکرد آنها می پردازیم سپس با مقایسه آنها زمان استفاده از آنها را مشخص میکنیم:
*Interface   چیست ؟*

به طور کلی  Interfaceها  یک قالب اجرائی برای کلاسها می باشند . بدین صورت که با تعریف مشخصات کلی متدها بدون پیاده سازی آنها، کلاسهای مشتق شده را ملزم به پیاده سازی کامل آن متدها میکند . بنابراین ، فقط مشخصات متدها یک بار در Interface تعریف می شوند و هر جا که لازم باشد پس از ارث بری  ، متدهای آنها پیاده سازی می شود . در کلیه نسخ دات نت Interface ها با حرف I  شروع میشود و با این خصیصه از دیگر اجزا جدا و مشخص می شوند . تعریف آن بسیار شبیه کلاس میباشد ولی با همان تفاوت که در بالا ذکر شد یعنی متدهای آن فاقد کد می باشند . اینتر فیس ها سازنده و فیلد هم ندارند و نمی شود از روی آنها نمونه ای ایجاد کرد .
*مزایای Interface  ها چیست ؟*

در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی Interface ها این مزیت را دارند که به هر تعداد که لازم است ، کلاسهای مشتق شده  از آنها ارث بری کنند . این موضوع یکی از مهم ترین مزایای Interface می باشد .
هم چنین با استفاده از Interface کد ها قبلیت بهتری در نگهداری ، انعطاف و استفاده مجدد پیدا میکنند .
*Abstract Class  چیست ؟*

کلاس Abstract  یکی از ابزارهای  مهم OOP  می باشد که نمیتوان از آنها نمونه ای ساخت . به عبارتی دیگر نمی توانیم متغیری از کلاس Abstract  تعریف کنیم .
یک کلاس Abstract  شبیه Interface میباشد ولی با دیدی وسیعتر . این کلاسها می تواند دارای متدهای Abstract  باشد که شبیه Interface فقط اعلام میشوند و باید در کلاسهای مشتق شده ، بازنویسی شوند . البته میتوان در این کلاسها متد هائی داشت که Abstract نیستند و احتیاجی به پیاده سازی آنها در کلاسهای مشتق شده ندارند .
با توجه به تعاریف ذکر شده کلاس Abstract  حالتی بین کلاسهای معمولی و Interface ها میباشد و کلاسی میباشد که غیر قطعی و ناتمام میباشد که باید در سطح فرزندانش تکمیل شود .
* مزایای کلاسهای Abstract  چیست ؟*

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

1-      یک کلاس معمولی می تواند از یک کلاس Abstract ارث بری کند ولی همان کلاس میتواند از چندین Interface ارث ببرد .
2-      یک Interface  فقط میتواند اعلان متدها و خصوصیتها را داشته باشد اما یک کلاس Abstract  علاوه بر آنها میتوانید متدها و خصوصیتهایی با کدهای کامل داشته باشد .
3-      عناصر موجود در کلاس Abstract میتوانند مانند یک کلاس معمولی دارای سطح دسترسی باشند  ولی Interface  ها فاقد این امکان می باشند .
4-      وقتی شما متدی را به کلاس Abstract اضافه می کنید ، اگر این متد Abstract  نباشد به طور خودکار به همه زیر کلاسها اعمال می شود اما در Interface اگر متدی اضافه کنید باید در تمام زیر کلاسها آن را اعمال کنید .
5-      کلاس Abstract   مانند کلاسهای معمولی می توانند دارای فیلد و عناصر دیگری باشند در حالی که Interface  فاقد این امکان می باشد .
6-      Abstract  یکی از انواع کلاس است ولی Interface   کلاس نیست .

*چه زمانی از Interface  ها یا کلاسهای Abstract استفاده کنیم ؟*

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

----------


## alireza.zahani

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

----------


## esafb52

این یعنی چی :



> *مزایای Interface  ها چیست ؟*
> 
> در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی  Interface ها این مزیت را دارند که به هر تعداد که لازم است ، کلاسهای مشتق  شده  از آنها ارث بری کنند . این موضوع یکی از مهم ترین مزایای Interface  می باشد .


فرضا مثلا من 3کلاس در یک پروژه دارم
و در کلاس 4 که تازه ایجاد میکنم میخوام از تمام متدهای و... اون سه کلاس ارث ببرم چطور باید اینکار با اینترفیس انجام بشه؟؟ ضمنا ماکه همه متدها ی اون کلاس ها تو اینترفیس ها پیاده سازی نمیکینیم که مثلا با ارث بری از چند اینترفیس در یک کلاس بتونیم این مشکل رو حل کنیم!! در ضمن اگه این کار رو هم کردیم باز مجبور میشیم تموم اون متد ها رو تو کلاس 4 هم بنویسیم!!درحالیکه ما نمیخواهیم این اتفاق بیفته !!!!!!

----------


## esafb52

با سلام کسی نیست در این مورد ما رو روشن کنه!!!!

----------


## plus

> این یعنی چی :
> فرضا مثلا من 3کلاس در یک پروژه دارم
> و در کلاس 4 که تازه ایجاد میکنم میخوام از تمام متدهای و... اون سه کلاس ارث ببرم چطور باید اینکار با اینترفیس انجام بشه؟؟ ضمنا ماکه همه متدها ی اون کلاس ها تو اینترفیس ها پیاده سازی نمیکینیم که مثلا با ارث بری از چند اینترفیس در یک کلاس بتونیم این مشکل رو حل کنیم!! در ضمن اگه این کار رو هم کردیم باز مجبور میشیم تموم اون متد ها رو تو کلاس 4 هم بنویسیم!!درحالیکه ما نمیخواهیم این اتفاق بیفته !!!!!!


مطمئن نیستم بهترین راه باشه، مثال رو برای کلاسی میزنم که میخواد متدهای دو کلاس رو ارث ببره:

interface IClass1
{
    void Method1();
}
class class1 : IClass1
{
    public void Method1()
    {
         ....
    }

}
interface IClass2
{
    void Method2();
}
class class2 : IClass2
{
    public void Method2()
    {
         ....
    }

}
class class3 : IClass1, IClass2
{
    private class1 c1;
    private class2 c2;
    public class3()
    {
        c1 = new class1();
	c2 = new class2();
    } 
    public void Method1()
    {
         c1.Method1();
    }
    public void Method2()
    {
         c2.Method2();
    }

}
class Program
{
	public static void Main()
        {
		class3 c3 = new class3();
		// c3 is IClass1 and IClass2
		Class1Needed(c3);
		Class1Needed(c3);
	}
	static void Class1Needed(IClass1 parameter)
	{
		parameter.Method1();
	}
	static void Class2Needed(IClass2 parameter)
	{
		parameter.Method2();
	}
}

----------


## negin51

به جنابعالي به عنوان برنامه نويس پيشنهاد شده است كه براي يك بانك برنامه اي بنويسيد كه بتواند اطلاعات مشتريان سپرده گذار را نگهداري وپردازش كند.در جايي از اين برنامه مي بايستي بهره سپرده با توجه به مدت سپرده و به تبع آن نرخ سود محاسبه شده و به مبلغ سپرده اضافه شود.نرخ بهره تابعي از مدت سپرده گذاريست.شما چه ميكنيد?ميتوانيد متدي با تعداد زيادي if ‎و else ‎بنويسيد كه باتوجه به مدت سپرده نرخ بهره را انتخاب كند و آن را در محاسبات به كار ببرد و آن را در يك كلاس قرار دهيد و با استفاده از ارث بري كلاسهاي فرزند را واداريد از اين كلاس و متد آن استفاده كنند.اگر جايي نياز به استفاده از وراثت چندگانه داشتيد چه ميكنيد?ميتوانيد از سي پلاس پلاس استفاده كنيد كه از اين نوع وراثت پشتيباني ميكند.اما آيا اين شد جواب?دوستاني كه خوانده اند سي شارپ از وراثت چندگانه پشتيباني نميكند بدانند سي شارپ به شكل كلاسيك يعني در سطح كلاس از وراثت چندگانه پشتيباني نمي كند اما اين وظيفه را به شكل مدرن با مفهوم اينترفيس پياده ميكند.شما اينترفيسي حاوي متدي براي محاسبه سود سپرده با توجه به مدت سپرده البته بدون بدنه وفقط حاوي نام ونوع برگشتي و احتمالا إرگومانها مينويسيد و سپس سپرده هاي شش ماهه,يك ساله ,دوساله و ... را در كلاسهاي جداگانه اي كه از اين اينترفيس ارث ميبرند قرار ميدهيد ودر هر كلاس بدنه متد موجود در اينترفيس را به شكل مناسب همان كلاس مينويسيد و از آن استفاده ميكنيد.اينترفيس زيربناي مبحث چندريختي در سي شارپ است. اين از مفهوم اينترفيس.اما براي فراگرفتن روش استفاده از آن به مستندات msdn ‎ومثالهاي عالي آن مراجعه كنيد.

----------


## jamalmoini

سلام دوستان عزیز
اگه امکانش هست فرق بین اینترفیس و کامپوننت و برام توضیح بدبد؟
ممنون از لطف شما

----------


## alireza.zahani

> سلام دوستان عزیز
> اگه امکانش هست فرق بین اینترفیس و کامپوننت و برام توضیح بدبد؟
> ممنون از لطف شما


این ها دو چیز جدا هستند
مقایسه آن ها شبیح فرق ماشین با درخت است
component یک ابزار طراحی شده توسط شخص دیگری است ، که شما در برنامه خود از قابلیت های آن استفاده میکنی
مثلا
برای نمایش آمار شما از نمودار یک شرکت که گرافیک زیبایی دارد استفاده میکنی
پس شما از componnet  آن شرکت استفاده کردی
ولی interface یک دید شی گرایی است که توسط شما پیاده سازی می شود

----------


## forodo

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

----------


## alireza.zahani

tooraj_azizi_1035  یه مثال زده

----------


## rahimlotfi

> با سلام کسی نیست در این مورد ما رو روشن کنه!!!!


سلام
داخلی این لینک می تونی دانلود کنی و ببینی مفهوم اینترفیس

http://s5.picofile.com/file/81635922...rface.rar.html 
موفق باشید

----------


## SabaSabouhi

سلام
تو اغلب کارها هیچ کاربردی نداره. مگه این بخواین کار خاصی انجام بدین، مثل نوشتن برنامه‌ای که Plugin قبول کنه.
Interface عموماً جایی استفاده می‌شه که چند نوع کلاس داریم که برخی خصوصیت‌هاشون مثل هم هست و قراره مثل هم کار کنه.
مثلاً plugin پرداخت اینترنتی، که همشون چند تا مرحله شناسایی و پرداخت و ... رو دارن.

صباصبوحی

----------


## feryt20

این پست واسه 10 خرداد 89 هست
همه هم جواباشونو گرفتن
واسه چی اسپم میدید الکی پستو میارید بالا؟؟؟؟

----------


## m.n0uri

> با سلام خدمت دوستان برنامه نویس عزیز
> یه چند مدت هستش که وقتی مقالاتی در مورد C#‎‎‎ می خونم به عبارت Interface بر می خورم. این سوال برام مطرح شده که این اینترفیس چی هست. تو سایتMSDN دنبالش گشتم ولی از انجای که انگلیسم خوب نیست چی متوجه نشدم
> حالا از دوستان گرامی که در ضمینه این مطلب اطلاعات دارند خواهش می کنم در این مورد توضیحاتی بفرمایند -  اگر امکان داره با مثال و نمونه کد 
> با تشکر



وقتی یک کلاس ، از یک رابط به ارث میبرد ( آن را پیاده سازی می کند) یعنی در واقع دارد ادای آن رابط را تقلید میکند و در می آورد.وقتی یک آدم خود را پولدار نشان میدهد و ادای آدم پولدارها را درمی آورد ، یعنی آن آدم اصلا پولدار نیستو هیچ خصوصیت یا صفت یا Field از آدم پولدارها ندارد.مثلا من اگر بخواهم خودم را پولدار نشان دهم ، می گویم مثلا من 10000000 تومان پول دارم.ولی اگر شما بخواهید خود را پولدار نشان دهید ، می گویید من سوار دودج چالنجر 2012 شده ام....پس هر کس یک ادا را می تواند هزار جور در آورد.پس رابط مجموعه ای از ادا ها (Function) ی بدون بدنه است و بدنه آنها را شخصی تعریف میکند که دارد آن راپیاده سازی میکند.پس چون صرفا یک اداست و چیزی از خود ندارد ، پس هیچ Field در رابط تعریف نمیشود.توابعی که در رابط هستند ، بدون Modifer های Public یا Private هستند ، چون شاید پیاده کننده بخواهدبعضی از اداهایش را نشان دهد و شاید بعضی ها را بخواهد مخفی یا Private کند.

ینترفیس به طور خلاصه همه جا کاربرد داره ;)
خب شما ببنید خیلی از کارها و کتابخانه های مایکروسافت هم از این مفهوم استفاده کرده.مثلا چطور در یک حلقه ی foreach اشیاء مختلف با نوع های مختلف در یک ساختمان داده مثلا لیست پیوندی ، یا لیست پیمایش می شوند درحالی که اشیاء متمایز هستند.
خب ساده است مایکروسافت یک اینترفیس تعریف کرده مثلا IEnumerable خب حالا کلاس های مختلف از این اینترفیس پیاده سازی می کنند.این میشه یک قرار داد بین همه ی کلاس های مختلف.حالا هر چند تا شی از کلاس های مختلف ساخته بشه و در یک لیست قرار بگیره براحتی قابل شمارش و پیمایش هست چرا چون کلاس اون شی این قرارداد(اینترفیس) رو پیاده سازی کرده است.در اینترفیس ما فقط کلیات را بیان می کنیم و هر کلاس که از اینترفیس ارث بری می کنه این کلیات را به صورت جزئی پیاده سازی می کنه.حالا در نظر بگیرید كلاسي با كلاسي ديگر مرتبط باشد و نیاز مند به یکی از متد های آن. فرض كنيد اين كلاس متدي دارد كه مقداري از نوع int به عنوان خروجی خود بر می گرداند. بعد ها برنامه نویس تصمیم می گیرد که مثلا به دلیل کوچک بودن int از long استفاده کند.
خب اینجا مشکلات عدیده ای پیش می آید اولا که کل فیلد های باید تغییر کنن ثانیا ممکنه باعث نتایج ناخواسته شوداما اگر از یک Interface استفاده می شد آنگاه برای ایجاد این تغییر مشکلی نبود زیرا کلاس یا برنامه ما به پیاده سازی در پشت صحنه آن اینترفیس کاری ندارد و از آن خبری ندارد و هر تغییری صورت بگیرد از برنامه ما پنهان است. پس تغييرات درون آن تاثيري بر رفتار و عملکرد برنامه ما(برنامه وابسته) نخواهد داشت و این برنامه از آن تغییرات بی خبر است.یک مثال خیلی ساده بزنم که این مفهوم بهتر جا بیافتد.مایکروسافت برای نشان دادن فرم ها و پنجره ها یک سری رابط هایی تعریف کرده است که برنامه نویسان در برنامه های خود از آنها استفاده می کنند.حال در نظر بگیرید به جای این اینترفیس ها مثلا از یک کلاس که یک متد برای نمایش فرم دارد استفاده می کرد و این را در اختیار کاربر(برنامه نویس) می گذاشت آنگاه اگر در آینده مثلا می خواست نحوه ی نمایش فرم را بهینه کند کلی برنامه نوشته شده برنامه نویسان چون وابسته به آن پیاده سازی بود باید تغییر می کرد و حال اینکه در واقعیت این طور نیست.پس نتیجه اینکه استفاده از اینترفیس باعث افزایش استقلال خواهد شد.یک مثال چرا سخت افزار ها روز به روز در حال رشد هستند و نرم افزار ها هم همین طور.خب هر نرم افزاری برای اجرا به سخت افزار خود نیاز دارد.وقتی سخت افزاری بهینه تر می شود یعنی در پیاده سازی دستورات آن تغییراتی به وجود آمده پس از این پس باید نرم افزار های نوشته شده هم دوباره باید تغییر کنند حال آنکه این طور نیست.مثلا CPU ها چرا همواره در حال رشد هستند و هیچ اخلالی در نرم افزار ها پیش نمی آید به این علت که یک واسط (ISA=instruction set abstraction) نوشته می شود که هر تغییر در لایه سخت افزار صورت گرفت از دید نرم افزار پنهان باشد.به عبارتی نقش مرز استقلال دو لایه را دارد.این خیلی خوب شدهه است دیگه .حالا نرم افزار هایی تولید می شود که نگرانی از تغییرات سخت افزاری ندارند. و سخت افزار هایی تولید می شوند که نگرانی از نرم افزار ها ندارند.

----------

