Interface ها در C#

جمعه 9 آبان 1393

در این مقاله به توضیح interfaceها و کاربردشان می پردازیم.

Interface ها در C#

وقتی می خواهیم interface را تعریف کنیم در واقع یک سری از قوانین را توضیح می دهیم.

یک class می تواند قوانینی را  که  توسط interface مشخص شده دنبال کند.

وقتی یک کلاس قوانین مشخص شده توسط interface را رعایت می کند در واقع می توان گفت آن کلاس interface را پیاده سازی کرده است.

شما می توانید برای تعریف interface  مانند زیر عمل کنید:

public interface <interface name>
{
	    //Specify the Contract
}

بیایید فرض کنیم یک interface  از یک گوشی قدیمی مدل Nokia وجود دارد که

Interface آن به شکل زیر است:

public interface INokiaOld
{
	    void SendSMS();
	    void HoldCall();
}

کد بالا مشخص کرده که تمام کلاس هایی که interface،INokiaOld را پیاده سازی می کنند باید قابلیت های SendSMSو HoldCall را داشته باشند.

و این در حالی است که چگونگی پیاده سازی این عملکردها چندان مهم نیست.

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

قوانین می گویند اگر تلفن از INokiaOld پیروی می کند باید قادر به فرستادن SMS باشد و همچنین توانایی نگه داشتن تماس را فراهم کنند.

پیاده سازی interface،INokiaOld:

در زیر کلاسی که این interface را پیاده سازی کرده می بینید:

class MyNokiaOldPhone : INokiaOld
{
	    //002_1: A Non Contract Function
	    public void somefunction1()
	    {
		        Console.WriteLine("Some Function 1");
	    }
	    //002_2: Contract Function 1
	    public void SendSMS()
	    {
		        Console.WriteLine("SMS Sent");
	    }
	    //002_2: Contract Function 2
	    public void HoldCall()
	    {
		        Console.WriteLine("Call Temporarily on Hold");
	    }
}

 

همان طور که می بینید کلاس، فانکشن somefunction1() را نیز ساپورت می کند.

 

در نگاه کاربر این انتظار وجود دارد که با دادن شماره تماس میتواند اس ام اس بفرستد و یا منتظر برقراری تماس شود.

کاربرد اول:

MyNokiaOldPhone phone = new MyNokiaOldPhone();
phone.SendSMS();
phone.somefunction1();

 

کاربرد دوم:

 

INokiaOld iface = phone;
iface.SendSMS();

در اولی کار خاصی انجام نشده و در آن  phoneرا به آن یک شی از کلاس در نظر می گیرد اما وقتی به دومی نگاه می کنیم نکات زیر آشکار می شود:

Iface به شیء MyNokiaOldPhone اشاره می کند.

Iface توانایی دسترسی به قابلت ها تعرف شده در InokiaOld را پشتیبانی می کند.

چون iface از نوع INokiaOld است نمی تواند به somefunction1() دسترسی داشته باشد.

Interface[INokiaNew]:

در زیر syntax برای توسعه دادن interface قبلی آمده است که کاملا شبیه ارث بری در کلاس است.

Interface ،INokiaNew برای ساپورت کردن از قابلیت جدید فرستادن MMS به همراه قابلیت های قبلی تعریف شده

ایجاد شده است.

Interface به شکل زیر است:

//003: Extended Interface
public interface INokiaNew: INokiaOld
{
	    void SendMMS_AVI();
}


وقتی یک کلاس interface،INokiaNew را پیاده سازی می کند باید قابلیت مورد انتظار INokiaOld را به همراه فرستادن MMS در فرمت AVI داشته باشد.

در زیر کلاس به شکل زیر است:

//004: Class that implements the Extended Contract
class MyNokiaNewPhone : INokiaNew
{
          //004_1: A Non Contract Function
          public void somefunction1()
          {
                   Console.WriteLine("Some Function 1");
          }
          //004_2: Base Contract Function 1
          public void SendSMS()
          {
                   Console.WriteLine("SMS Sent");
          }
          //004_3: Base Contract Function 2
          public void HoldCall()
          {
                   Console.WriteLine("Call Temporarily on Hold");
          }
          //004_4: Extended Contract Function 3
          public void SendMMS_AVI()
          {
                   Console.WriteLine("MMS Sent in AVI Format");
          }
}

بیایید تا با هم نگاهی به کاربرد interface توسعه یافته بیندازیم:

کاربرد سوم:

MyNokiaNewPhone phone2 = new MyNokiaNewPhone();
INokiaOld iface_basic = phone2;
INokiaNew iface_delux = phone2;
iface_basic.SendSMS(); 	//در این حالت نمی توان ام ام اس فرستاد
iface_delux.SendSMS(); //در این حالت قابلیت های تعریف شده پایه قابل انجام است
iface_delux.SendMMS_AVI(); //در این حالت به غیر از استفاده از قابلیت های تعریف شده امکانات جدید تعریف شده نیز قابل انجام است

پیاده سازی بیشتر از یک   [INokiaNew, ISamSung ]interface:

بیایید interface زیر را برای ISamSung در نظر بگیریم:

public interface ISamSung
{
	    void SendMMS_Mpeg();
          
}

در اینجا کلاس HyBridPhone  هم قابلیت های Nokia Old و همچنین مولفه های جدید تعریف شده Samsung را داراست.

به این دلیل ما می توانیم هر دو interface،ISamSung  و InokiaOldرا پیاده سازی کنیم.در زیر کلاسی تعریف کریم که هر دو interface را پیاده سازی کرده است.

class HybridPhone : INokiaOld, ISamSung
{
	    //006_1: Contract for Nokia
	    public void SendSMS()
	    {
		        Console.WriteLine("SMS Sent");
	    }
	    //006_2: Contract Nokia
	    public void HoldCall()
	    {
		        Console.WriteLine("Call Temporarily on Hold");
	    }
	    //006_3: Contract Samsung
	    public void SendMMS_Mpeg()
	    {
		        Console.WriteLine("MMS Sent in MPeg format");
	    }
}

توسط شی ء تعریف شده از  کلاس HybridPhone می توان به قابلیت های Samsung و Nokia،دسترسی پیدا کرد.

در زیر به توضیح کدها می پردازیم:

HybridPhone phone3 = new HybridPhone();
// استفاه از  Nokia Interface
INokiaOld iface_nokia = phone3;
iface_nokia.SendSMS();
// استفاه از Samsung inteface
ISamSung iface_samsung = phone3;
iface_samsung.SendMMS_Mpeg();

تبدیل کردن interfaceها:

HybridPhone phone3 = new HybridPhone();
INokiaOld iface_nokia = phone3;
//005_1: Check the Type using is keyword
if (iface_nokia is ISamSung)
{
	    //005_2: Cast it to the other interface type
	    ISamSung iface_samsung1 = (ISamSung) iface_nokia;
	    iface_samsung1.SendMMS_Mpeg();
}

در کد بالا ابتدا چک می کنیم که آیا iface_nokia از نوع ISamSung  است؟ شما در نگاه اول پاسخ منفی می دهید،اما اگر آن را اینگونه بخوانید که آیا شیء اشاره شده توسط INokiaOld ، ISamSung نیز هست پاسخ شما مثبت خواهد بود.

نگاهی بیندازید به اینکه چگونه شی ء اشاره شده توسط iface_nokia به ISamSung تبدیل می شود.به محض اینکه تبدیل انجام شود شما قادر به دسترسی به قابلیت Samsung خواهید بود.

تبدیل و مقدار دهی:

ISamSung iface_samsung2 = iface_nokia as ISamSung;
iface_samsung2.SendMMS_Mpeg();

در کد بالا کلمه کلیدی  As  نیز عمل تبدیل را انجام می دهد وقتی شی ء از نوعISamSung  نیست،مقدار NULL به iface_samsung2  اختصاص می یابد.

 

فایل های ضمیمه

جعفری

نویسنده 22 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 9 تشکر

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید