رفتن به مطلب
  • Sky
  • Blueberry
  • Slate
  • Blackcurrant
  • Watermelon
  • Strawberry
  • Orange
  • Banana
  • Apple
  • Emerald
  • Chocolate
  • Charcoal

عضویت ویژه طلایی گارد ایران با تخفیف 50%

برای عضویت کلیک کنید

hosseinfara4

آموزش کلاس های جنریک(عمومی)

Recommended Posts

کلاس های جنریک (عمومی) کلاس هایی هستند که از آنها می توان برای انواع داده های متفاوت استفاده کرد.

کلاس های جنریک (عمومی)

قبل از این که به بحث کلاس های جنریک در سی شارپ بپردازیم  بهتر است به توابع عمومی (جنریک) نگاهی بیندازیم. به یک مثال توجه کنید. فرض کنید می خواهیم یک تابع به نام sum برای جمع کردن دو عدد ورودی بنویسیم. توابع زیر می توانند برای این منظور تعریف شوند:

(public int sum( int a, int b
}
   ;( return (a + b   
{
(public double sum( double a, double b
}
  ; (return (a + b  
{
(public byte sum( byte a, byte b
}
;(return (a + b  
{

وقتی که این سه تابع را تعریف می کنیم، هنگامی که تابع sum را با پارامترهایی از نوع int فراخوانی می کنیم، تابع اول فراخوانی می شود. اگر همین تابع sum را با پارامترهایی از نوع double فراخوانی کنیم، تابع دوم فراخوانی می شود و … . در اینجا ما سه بار تابع sum را تعریف کرده ایم.

در توابع عمومی (جنریک) می توان تابع فوق را یک بار و به صورت زیر تعریف کرد:

(public double sum(T a, T b
}
   ((if( typeof(T) == typeof(int       
  }       
       ((return (double)( Convert.ToInt32(a) + Convert.ToInt32(b           
  {        
  ((if( typeof(T) == typeof(double      
}       
       ;(return Convert.ToDouble(a) + Convert.ToDouble(b         
{       
         ((if( typeof(T) == typeof(byte     
 }     
       ((return (double)( Convert.ToByte(a) + Convert.ToByte(b        
        {     
    ; return 0 
{

حالا برای فراخوانی تابع sum می توانیم از دستور زیر استفاده کنیم:

;(double result = sum(12.509, 49.4

همانطور که می بینید با توجه به ورودی تابع که بین < >قرار گرفته است، پارامترهای تابع متناسب با آن عمل می کنند. در این مثال شاید دو سوال ذهن شما را درگیر کرده باشد: 1- کد تابع sum نسبت به قبل پیچیده تر شده است. 2- خروجی برای تمام ورودی ها از نوع double است.
در پاسخ به این سوالات باید گفت که با توجه به مثالی که ذکر شده و با توجه به عملی که در این تابع انجام می شود (یعنی عمل جمع) کد تابع کمی پیچیده شده است ولی در مورد توابعی که در ادامه خواهیم گفت، فوق العاده کار را ساده می کنند. و اما در مورد سوال دوم. خروجی تابع sum می تواند از نوع T باشد. یعنی اپر کاربر هنگام فراخوانی تابع sum به صورت sum(12, 20); ž عمل کند خروجی نیز از نوع short بشود ولی در این مثال فقط برای سادگی کار این عمل را انجام ندادیم.

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

public class Node
}
  ;  public T data   
   ; public T next   
   
    (public Node(T value    
   }     
       ; data = value       
        ;next = null       
{    
{

اگر همین کلاس را می خواستیم برای انواع داده مختلف تعریف کنیم، کار بسیار دشواری پیش رو داشتیم. اگر برای همین کلاس بخواهیم تعیین کنیم که ورودی کلاس (یعنی T) از نوع داده های عددی باشد، یعنی int, double, byte, short, single و … می توانیم خط اول کلاس را به صورت زیر تغییر دهیم:

public class Node where T: struct
{

}

خط اول تعریف بالا به کامپایلر سی شارپ می گوید که ورودی تعیین شده (یعنی T) فقط باید از انواع داده ای عددی (یا به طور تخصصی تر انواع داده هایی که valued-type هستند و نه referenced-type) باشد.

برای توضیح بیش تر به کلاس لیست پیوندی تعریف شده زیر توجه کنید (توضیحات به خود شما واگذار می شود!):

public class Node where T : struct
}
    ; public T data   
     ;public Node next   
   (public Node(T value      
  }      
       ;data = value        
        ; next = null        
  {      
{
public class myLinkedList where Y : struct
}
     ;private Node head, cur, end   
     ;public int Count 

  

   

 () public myLinkedList     
  }     
        ;head = cur = end = null     
        ; Count = 0     
    {    
     (public void Add(Y newValue   
   }   
         (if (head == null    
         }     
             ;(head = end = new Node(newValue     
               {     
        else   
        }   
             ;(end.next = new Node(newValue    
             ;end = end.next    
       {  
         ;++Count   
{ 
     ()public Y[] ToArray  
   }  
       ;  [Y[] result = new Y[Count    
         ;cur = head    
        ; int i = 0    
        ( while (cur != null  
      }    
            ; result[i] = cur.data    
            ; cur = cur.next    
         {    
         ;return result      
     {  
{

 

 

 

 

 

 

 

 

__-__سوالی بود درخدمتم__-__

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

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

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

درباره ی ما

تیم امنیتی گارد ایران یک گروه مستقل است که قوانین آن با خط مشی جمهوری اسلامی ایران مغایرت ندارد. تیم امنیتی گارد ایران از سال 1393 فعالیت خود را آغاز کرد و هدف این تیم تامین امنیت سایت ها و سرورهای ایرانی است. تیم ما همیشه برای دفاع از مرزهای سایبری سرزمین عزیزمان ایران آماده است.
×