اینترفیس
Csharp interface
یک interface مجموعهای از متدها را تعریف میکند که توسط یک کلاس اجرا خواهند شد. یک interface هیچ متدی را اجرا نمیکند، از اینرو، interface یک سازهی کاملاً منطقی است که فقط نشاندهندهی قابلیت و عملکرد است و هیچ قسمت اجرایی ندارد.
بعضی مواقع در برنامهنویسی شیگرا تعریف اینکه یک کلاس چه کاری را باید انجام دهد، میتواند مفید باشد اما اینکه اینکار را به چه روشی انجام میدهد مهم نیست.شما میتوانید interface یک کلاس را بهطور کامل از بخش اجرایی آن جدا کنید که این کار توسط کلمهی کلیدی interface انجام میشود.
Interface از نظر syntax متشابه با abstract class است. در interface نیز متدها بدنه ندارند و این بدین معنی است که در interface متدها اجرا نمیشوند. Interface مشخص میکند که چه کاری باید انجام شود اما به چگونهگی انجام شدن آن اهمیت نمیدهد و شما هرطور که مایل هستید متد مورد نظر را اجرا میکنید. هنگامیکه یک interface تعریف میشود، هر تعداد کلاس که شما مد نظر دارید میتوانند این interface را اجرا کنند. همچنین یک class میتواند به تعداد دلخواه interface اجرا کند.
برای اجرای یک interface، کلاس باید بدنهی متدهای تعریف شده در interface را فراهم آورد. هر کلاس، آنطور که بخواهد برای اجرای این متدها (بدنههایی که در کلاس خودش برای متدهای interface آماده کرده است) اقدام میکند. بنابراین دو کلاس میتوانند یک interface را به روشهای مختلفی اجرا کنند اما هردو کلاس شامل تمام متدهایی که در interface مشخص شده است، میباشند. با استفاده از interface، سیشارپ به شما اجازه میدهد جنبهی One Interface, Multiple Method از polymorphism را بهکار گیرید.
Interface توسط کلمهی کلیدی interface تعریف میشود. در زیر فرم ساده شدهی یک interface را میبینید:
1 2 3 4 5 6 | interface name { ret-type method-name1(param-list); ret-type method-name2(param-list); // ... ret-type method-nameN(param-list); } |
اسم interface توسط name مشخص میشود. متدها نیز توسط return type، نام و پارامترها (signature) تعریف میشوند. این متدها در واقع abstract method هستند. همانطور که پیشتر ذکر شد، در interface، متدها بدنهی اجرایی ندارند و از اینرو، کلاسی که interface دارد باید تمام متدهای تعریف شده در interface را اجرا کند. در یک interface، متدها implicitly public هستند. یعنی بهصورت پیشفرض و خودکار public هستند و شما اجازهی تغییر این حالت را ندارید.
در زیر یک نمونه از interface را میبینید که مشخص کنندهی interface یک class است که یک سری عدد را تولید میکند:
1 2 3 4 5 6 | public interface ISeries { int GetNext(); // return next number in series void Reset(); // restart void SetStart(int x); // set starting value } |
نام این interface را ISereis انتخاب کردیم. اگرچه پیشوند I ضروری نیست اما اکثر برنامهنویسان از این پیشوند استفاده میکنند تا تفاوت interface را با class مشخص سازند. ISeries بهصورت public تعریف شده است، بنابراین میتواند توسط هر کلاسی، در هر برنامهای اجرا شود.
نام این interface را ISereis انتخاب کردیم. اگرچه پیشوند I ضروری نیست اما اکثر برنامهنویسان از این پیشوند استفاده میکنند تا تفاوت interface را با class مشخص سازند. ISeries بهصورت public تعریف شده است، بنابراین میتواند توسط هر کلاسی، در هر برنامهای اجرا شود.
علاوه بر متدها، interface میتواند دارای property، indexer و event باشد. در حال حاضر تمرکز بحث روی methods, properties و indexers خواهد بود. با event ها در مقالات آینده آشنا خواهید شد. Interface ها نمیتوانند data member داشته باشند. آنها همچنین دارای constructor، destructor و operator methods نیستند و هیچ عضوی نمیتواند در آنها بهصورت static تعریف شود.
اجرای interface ها
زمانیکه یک interface تعریف میشود، یک یا چند کلاس میتوانند این interface را اجرا کنند. برای اجرای یک interface، نام آن را بعد از نام کلاس (به همان طریقی که نام base class را مینوشتید) مینویسید.
فرم کلی کلاسی که یک interface را اجرا میکند به شکل زیر است:
1 2 3 | class class-name : interface-name { // class-body } |
در اینجا، نام آن interface که قرار است توسط کلاس اجرا شود با interface-name مشخص شده است. هنگامیکه کلاسی میخواهد یک interface را اجرا کند، بایستی بهطور کامل آن interface را اجرا کند و نمیتواند فقط بخشی از آن را برای اجرا انتخاب کند.
یک کلاس میتواند بیشتر از یک interface را اجرا کند. برای این منظور، پس از نام کلاس، لیست اسامی interface های مورد نظر را توسط کاما از هم جدا میکند. یک کلاس هم میتواند از یک کلاس دیگر ارثبری کند و هم چندین interface را اجرا کند. در این مورد باید نام base class را در ابتدای لیستی که توسط کاما از هم جدا کردهاید، قرار دهید.
متدهایی که interface را اجرا میکنند باید public باشند زیرا متدها درون interface بهصورت implicitly public هستند و از اینرو اجرای آنها نیز باید public باشد. همچنین return type و signature متدهای اجرایی باید دقیقاً با متدهای تعریف شده در interface مطابقت داشته باشد.
در زیر مثالی میبینید که در آن ISeries interface اجرا شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | public interface ISeries { int GetNext(); // return next number in series void Reset(); // restart void SetStart(int x); // set starting value } // Implement ISeries. class ByTwos : ISeries { int start; int val; public ByTwos() { start = 0; val = 0; } public int GetNext() { val += 2; return val; } public void Reset() { val = start; } public void SetStart(int x) { start = x; val = start; } } |
همانطور که میبینید، کلاس ByTwos تمام متدهای تعریف شده در ISeries را اجرا میکند. توجه کنید که کلاس نمیتواند فقط بخشی از interface را اجرا کند و مجبور به اجرای تمام آن است.
Csharp interface Csharp interface Csharp interface Csharp interface Csharp interface Csharp interface Csharp interface Csharp interface Csharp interface