Interface ها در C#
جمعه 9 آبان 1393در این مقاله به توضیح interfaceها و کاربردشان می پردازیم.
وقتی می خواهیم 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 اختصاص می یابد.
- C#.net
- 4k بازدید
- 9 تشکر