محتویات سایت
        برچسب های محبوب 








 
   معرفی اینترفیس های جنریک
  همانند کلاس ها و ساختار ها (structures)، اینترفیس ها نیز می توانند به شکل جنریک پیاده سازی شوند و از مزایای جنریک ها استفاده نمایند.
   C#
   ۳۱۵۹۹
   این مقاله حاوی فایل ضمیمه نمی باشد
   مرتضی صحراگرد
   ۱۳۸۷/۲/۸
نسخه قابل چاپ نسخه قابل چاپ

همانند کلاس ها و ساختار ها (structures)، اینترفیس ها نیز می توانند به شکل جنریک پیاده سازی شوند و از مزایای جنریک ها استفاده نمایند.
در این مقاله مروری مختصر بر اینترفیس های جنریک و نحوه پیاده سازی آنها داشت.
برای تعریف یک اینترفیس جنریک، باید یک نوع پارامتر (type parameter) به آن نسبت دهیم. به قطعه کد زیر توجه فرمایید.


public interface IList<T>
{
     void AddHead(T item);
     void RemoveHead(T item);
     void RemoveAll();
}

همانطور که مشاهده می نمایید، در قطعه کد بالا ما یک اینترفیس به نام IList تعریف نموده ایم که دارای یک نوع پارامتر می باشد. این اینترفیس می تواند به شکل زیر پیاده سازی شود. توجه داشته باشید که هنگام پیاده سازی این انترفیس توسط کلاس، حتما باید یک نوع پارامتر مشخص به اینترفیس نسبت دهیم. در مثال زیر ما نوع int را به اینترفیس نسبت داده ایم و متدها نیز، پارامتری از نوع int را پذیرفته اند.


public class NumberList : IList<int>
{
     public void AddHead(int item)
          {...}
     public void RemoveHead(int item)
          {...}
     public void RemoveAll()
          {...}
     //Rest of the implementation
}

زمانی که قصد دارید از اینترفیس IList که توسط کلاس NumberList پیاده سازی شده است، استفاده نمایید، باید نوع پارامتر آن را نیز مشخص نمایید. قطعه کد زیر مثالی در این مورد می باشد.


IList<int> list = new NumberList( );
list.AddHead(3);

اینترفیس های جنریک به شما اجازه می دهند که یک توصیف انتزاعی از سرویس ها به وجود آورید. به عبارت دیگر شما می توانید پیاده سازی های مختلف با نوع های مختلفی از پارامتر ها،  داشته باشید. به دو پیاده سازی مختلف زیر از اینترفیس IList توجه فرمایید.


public class NumberList : IList<int>
{...}

public class NameList : IList<string>
{...}

نحوه استفاده از کلاس بالا به شکل زیر می باشد.


MyClass<int> intMyClass = new MyClass<int>();
MyClass<
string> stringMyClass = new MyClass<string>();
intMyClass.AddHead(1);
stringMyClass.AddHead(
"www.30sharp.com");

اینترفیس های جنریک را نیز می توان همانند اینترفیس های معمولی به شکل صریح (explicitly) پیاده سازی نمود.


public class NumberList : IList<int>
   {
         void IList<int>.AddHead(int item)
            {...}
         void IList<int>.RemoveHead(int item)
            {...}
         void IList<int>.RemoveAll()
            {...}
         //Rest of the implementation
}

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


public class List : IList<int>, IList<string>
   {
      public void AddHead(int item)
         {...}
      public void AddHead(string item)
         {...}
      public void RemoveAll()
         {...}
      //Rest of the implementation
}

اگر کمی به قطعه کد بالا دقت کنید متوجه می شوید که ترجیحا بهتر است متد RemoveAll به شکل صریح (explicitly) پیاده سازی شود زیرا در غیر این صورت این متد بین دو پیاده سازی int و string به اشتراک گذاشته می شود.
در صورت پیاده سازی این متد به شکل صریح، می توان از آن به شکل زیر استفاده نمود.


IList<int> list = new List( );
list.RemoveAll( );

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


public interface IList<T>
   {
      void AddHead(T item);
      void RemoveHead(T item);
      void RemoveAll();
      T GetHead();
   }

اکنون به پیاده سازی این اینترفیس توجه نمایید.


public class List : IList<int>, IList<string>
   {
         int IList<int>.GetHead()
            {...}
         string IList<string>.GetHead()
            {...}
         //Rest of the implementation
   }

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

منبع : 30sharp.com