همانطورکه میدانید در درس قبل، به بررسی کلاس های پایه یا Abstract ها در C# پرداختیم. Interface ها در C# نیز تا حد زیادی مشابه Abstract Class ها بوده و در این ویژگی که نمی توان از روی آن یک نسخه یا شی ساخت با هم یکسان هستند.
با این حال، Interface ها حتی از کلاس های Abstract نیز مفهومی تر هستند، به دلیل این که بدنه دستورات متد (method body) در آن ها اصلا مجاز نیست (یعنی نمی توان دستوراتی را برای متدهای تعریف شده تعیین کرد). از آنجایی که در Interface ها متد با کد واقعی وجود ندارد، بنابراین به فیلدها Fields نیز نیازی نیست. اما تعیین خواص Propertoes، اندیس ها indexer و رویدادها event امکان پذیر است.
شما می توانید یک Interface را به عنوان یک Contract (قرارداد) نیز در نظر بگیرید، یعنی کلاسی که اجرای آن مستلزم اجرای تمامی متدها methods و خواص Properties کلاس است.
نکته :

نکته مهم درباره Interface ها این است که از آنجایی که C# امکان به ارث بری چندگانه (multiple inheritance) را نمی دهد، یعنی یک کلاس از بیش از یک کلاس پایه به ارث برود، اما اجازه ای Interface های چندگانه را می دهد.

اما تمامی این موارد گفته شده در کد، به چه شکل خواهد بود. کد مثال زیر یک نمونه خوب از Interface ها در C# است. به کد مثال دقت کنید، در ادامه توضیحاتی راجع به آن ارائه خواهیم داد
?
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
۲۳
۲۴
۲۵
۲۶
۲۷
۲۸
۲۹
۳۰
۳۱
۳۲
۳۳
۳۴
۳۵
۳۶
۳۷
۳۸
۳۹
۴۰
۴۱
۴۲
۴۳
۴۴
۴۵
۴۶
۴۷
۴۸
۴۹
۵۰
۵۱
۵۲
۵۳
۵۴
۵۵
۵۶
۵۷
۵۸
۵۹
۶۰

using System;
using System.Collections.Generic;

namespace Interfaces
{
class Program
{
static void Main(string[] args)
{
List dogs = new List();
dogs.Add(new Dog(“Fido”));
dogs.Add(new Dog(“Bob”));
dogs.Add(new Dog(“Adam”));
dogs.Sort();
foreach(Dog dog in dogs)
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}

interface IAnimal
{
string Describe();

string Name
{
get;
set;
}
}

class Dog : IAnimal, IComparable
{
private string name;

public Dog(string name)
{
this.Name = name;
}

public string Describe()
{
return “Hello, I’m a dog and my name is ” + this.Name;
}

public int CompareTo(object obj)
{
if(obj is IAnimal)
return this.Name.CompareTo((obj as IAnimal).Name);
return 0;
}

public string Name
{
get { return name; }
set { name = value; }
}
}
}

بیایید از میانه کد، جایی که Interface را تعریف کرده ایم، شروع کنیم. همانطور که متوجه شدید، تنها تفاوت در تعریف یک Interface به جای Class واژه کلیدی به کار رفته است که interface به جای کلاس نوشته شده است. همچنین، قبل از نام Interface یک I را برای تلقی عبارت interface قرار داده که این فقط یک استاندارد کد نویسی بوده و نیازی به رعایت آن نیست. شما می توانید Interface مورد نظر خود را در هر جای برنامه که بخواهید فراخوانی کنید، و از آنجا که فراخوانی آن ها شبیه فراخوانی کلاس ها است، قرار دادن I قبل از نام Interface به درک بهتر کد توسط کدنویس کمک می کند.
سپس متد Describe را تعریف کرده و بعد از آن خاصیت Name Property را نوشته که دارای هر دو واژه کلیدی get و set بوده و به این معناست که یک خاصیت هم نوشتنی و هم خواندنی است.
نکته :

همانطور که متوجه شدید، خواص تعیین کننده میدان دید یا سطح دسترسی (access modifiers) مثل public، private، protected و … در ابتدای نام Interface قرار داده نشده است. زیرا این خواص در Interface ها مجاز نبوده و آن ها همه به صورت پیش فرض public هستند.

در مرحله بعدی کلاس Dog class را قرار داده ایم. سپس با قرا دادن یک : بین نام کلاس و Interface مورد نظر، کلاس Dog از Interface به ارث رفته است، دقیقا مثل کلاس ها. اما در کد فوق دو Interface را برای کلاس Dog به کار برده و آن ها را با کاما (،) از هم جدا کرده ایم. شما می توانید هر تعداد Interface که بخواهید را در مقابل نام کلاس تعریف کنید، اما در این مثال ما فقط دو Interface به نام های IAnimal و IComparable را به کلاس خود نسبت داده ایم. IComparable یک Interface مشترک بین کلاس هایی که قابلیت مرتب شدن (sorting) دارند، می باشد. نتیجه گیری این که، در کد فوق ما هم یک method و یک property را از IAnimal Interface در کد استفاده کرده و همزمان متد Compare To را از IComparable interface را به کار برده ایم.
اکنون ممکن است با خودتان فکر کنید، اگر همه کارها را ما خودمان باید انجام داده و کلیه متدها و خواص Properties لازم را در کد تعریف کنیم، چرا این قدر برای نوشتن Interface به خودمان زحمت بدهیم.
جواب سوال فوق را به خوبی در بخش بالایی کد مثال می توانید مشاهده کرده و متوجه شوید چرا این قدر زمان گذاشتن، با ارزش خواهد بود.
در کد مثال فوق، ما تعدادی Dog را به عنوان object های یک list تعریف نموده و سپس لیست خود را مرتب یا sort کرده ایم. اما list از کجا می داند که چگونه نام سگ ها را مرتب کند؟ به دلیل این که، کلاس Dog Class دارای متدی به نام CompareTo است که به آن می گوید چگونه دو Dog را با هم مقایسه کند.
اما چگونه list می کند که شی Dog object می تواند عمل مرتب سازی انجام داده و بایستی کدام متد را برای مقایسه سگ ها فراخوانی کند. به دلیل اینکه ما این کار را با تعیین یک Interface مناسب و نسبت دادن آن به کلاس، به list اعلام کرده ایم. Interface بایستی متد CompareTo را اجرا کرده و این زیبایی استفاده از Interface ها در کد است.