جنریک ها در سی شارپ ما را قادر خواهند ساخت کلاس هایی را تعریف کنیم که در زمان استفاده از آنها (و نه در زمان تعریف) نوع داده ای فیلد ها ، پروپرتی ها و متد های آنها را مشخص کنیم. در این فصل با کلاس های جنریک در سی شارپ آشنا میشویم.
جنریک ها
جنریک ها در نسخه ۲ زبان سی شارپ معرفی شدند. جنریک ها به ما اجازه میدهند کلاسهایی را تعریف کنیم که نوع داده ای فیلدها ، پارامتر ها و متد هایشان در زمان استفاده از آنها تعیین شوند. یک کلاس جنریک میتواند به وسیله براکت های زاویه ای <>
تعریف شود. نمونه مثال زیر یک کلاس جنریک ساده را نشان میدهد :
class MyGenericClass<T>
{
private T genericMemberVariable;
public MyGenericClass(T value)
{
genericMemberVariable = value;
}
public T genericMethod(T genericParameter)
{
Console.WriteLine("Parameter type: {0}, value: {1}", typeof(T).ToString(),genericParameter);
Console.WriteLine("Return type: {0}, value: {1}", typeof(T).ToString(), genericMemberVariable);
return genericMemberVariable;
}
public T genericProperty { get; set; }
}
همانطور که در مثال بالا مشاهده می کنید کلاس MyGenericClass
به همراه <T>
تعریف شده است. علامت های براکت زاویه ای <>
به ما نشان می دهد که کلاس مورد نظر جنریک بوده و نوع دادهی اعضای آن بعداً مشخص خواهد شد. در اینجا به جای نوع داده ای از کاراکتر T
استفاده کرده ایم. اما شما میتوانید از هر کاراکتر و یا کلمه دیگری به جای آن استفاده کنید.
اکنون میتوان در زمان استفاده از کلاس جنریک تعریف شده در بالا نوع داده ای آن را مشخص کرد. در نمونه مثال زیر از نوع داده ای int
استفاده شده است :
MyGenericClass<int> intGenericClass = new MyGenericClass<int>(10);
int val = intGenericClass.genericMethod(200);
خروجی نمونه مثال بالا به شکل زیر است :
Parameter type: int, value: 200 Return type: int, value: 10
شکل زیر نشان میدهد که کامپایلر چطور نوع داده ای int
را جایگزین کاراکتر T
میکند :
کلاس <MyGenericClass<int
تعریف شده در بالا به شکل زیر کامپایل می شود :
class MyGenericClass
{
private int genericMemberVariable;
public MyGenericClass(int value)
{
genericMemberVariable = value;
}
public int genericMethod(int genericParameter)
{
Console.WriteLine("Parameter type: {0}, value: {1}", typeof(int).ToString(), genericParameter);
Console.WriteLine("Return type: {0}, value: {1}", typeof(int).ToString(), genericMemberVariable);
return genericMemberVariable;
}
public int genericProperty { get; set; }
}
شما می توانید در زمان نمونه سازی از کلاس از هر نوع داده ای دیگری استفاده کنید. در نمونه مثال زیر از نوع داده ای string
استفاده شده است :
MyGenericClass<string> strGenericClass = new MyGenericClass<string>("Hello Generic World");
strGenericClass.genericProperty = "This is a generic property example.";
string result = strGenericClass.genericMethod("Generic Parameter");
خروجی نمونه مثال بالا به شکل زیر است :
Parameter type: string, value: Generic Parameter
Return type: string, value: Hello Generic World
کلاس های جنریک به عنوان کلاس پایه
زمانی که از یک کلاس جنریک ارث بری می کنید باید نوع داده ای جنریک را مشخص کنید :
class MyDerivedClass : MyGenericClass<string>
{
//implementation
}
اما اگر بخواهید کلاس مشتق شده ، یک کلاس جنریک باشد، نیاز نیست نوع داده ای را مشخص کنید :
class MyDerivedClass<U> : MyGenericClass<U>
{
//implementation
}