خودتون که قبلا داشتید با Generic Type ها کار می کردید، یادتون که نرفته؟ میخواستید به زور string اش کنید که گفتم string یک نوع خاصه، اگه قرار باشه فقط string باشه که دیگه Generic Type نمیشه. اینم شبیه همونه، Generic Class ئه، Generic Interface ئه، Generic Struct ئه. یک نوع عمومی نامشخص به اسم T تعیین می کنید که موقع استفاده تعیین میشه. مثلا شما نوشتید <List<Dog ، تو پیاده سازی List هر جا T بوده بجاش Dog جایگزین شده. فلسفه اش اینه، یک مدل کلی کد نویسی کنید، بعد با انواع داده های مختلف استفاده کنید. بجای اینکه بیایید برای int و double و float و string کلاس های List مجزا بسازید که همه شون شبیه هم باشند و فقط نوع داده شون فرق کنه یه دونه Generic اش رو بنویسید.
شما اول یه نگاه به تعریف کلاس اش بندازید :
کد:
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
یک نگاهی به نحوه استفاده اش بندازید :
کد:
List<dog> dogs = new List<dog>();
بعد یک نگاه به تعریف Sort بندازید :
کد:
public void Sort();
public void Sort(Comparison<T> comparison);
public void Sort(IComparer<T> comparer);
public void Sort(int index, int count, IComparer<T> comparer);
مساله اینه که Sort دنبال یک مقایسه گر برای Dog vs ِDog می گرده. یا باید خود اعضاء <IComparable<Dog رو پیاده سازی کرده باشن یا IComparable (مقایسه گر پیشفرض) ای پیاده سازی کرده باشن که از عهده مقایسه Dog با Dog بر بیاد یا یه <IComparer<Dog بهش معرفی کنید. شما اومدید در خود اعضاء IComparer ئه object vs object رو پیاده سازی کردید، Sort از این IComparer استفاده نمی کنه، چون متدی با تعریف
Sort(IComparer comparer) نداره. مساله این نیست که Compare شما از عهده اش برنمیومد، چیزی ساخته بودید که Sort تو جستجو اش محل نمیذاشت و روش حساب باز نمی کرد و به هر حال ازش استفاده نمی کرد.