شاید برای شما این سوال مطرح شده باشد ، که چگونه می توان کلاس یا متی و .. بنویسیم که مثلا با انواع داده ها کار کند .مثلا متدی بنویسیم که پارامترهای ورودی آن هم از نوع int و هم از نوع float باشد و یا کلاسی بنویسید که هم پارامتر های int را بپذیرد و هم string ، خوب حتما می خواهید چندین متد یا چندین کلاس بنویسید و یا فکر می کنید باید override کنید . نه اینگونه نیست .از زمان اریه شده .net2 چند سالی می گذرد ، اما یکی از قابلیتهایی که در آن زمان اضافه شد generic ها بود .که تا به امروز هم استفاده فراوانی دارد .generic ها ساختار گرامری جدیدی به دات نت اضافه کرده اند .مثلا می توانید یک کلاس کلی بنویسید بدون اینکه مشخص کنید که چه نوع داده ای رامی پذیرد .البته این کل ماجرا نیست بلکه به نظر بنده generic ها پاسخی هستند به برخی از نیازها و سواالات زیر :
1-آیا می توان interfaces, classes, methods, events and delegates. داشته باشیم که بتواند انواع مختلف داده را بپذیرد؟
2-آیا می توان آرایه یا لیستی از عناصر گوناگون داشته باشیم که بتواند انواع مختلف داده ها را در خود ذخیره کند ؟
3-آیا می توان بدون پیاده سازی مجدد یک الگوریتم آن را با ساختار داده ای متفاوت دیگری بکار ببریم؟
سوالات فراوان است اما بنده به همان سه سوال بالا اکتفا می کنم . و وارد بحث خواهم شد ، ابتدا تعریف
تعریف generic
یک کلاس یا متد و یا اینترفیس و غیره شبیه یک کلاس) یا متد و یا اینترفیس و غیره( عادی تعریف می شود ، با این تفاوت که بعد از نام کلاس ، نوع generic مشخص می گردد. نوع داده ای generic بوسیله کلاس می توانند به عنوان نوع داده یک عضو از کلاس یا به عنوان نوع داده پارامتری متدها استفاده شوند.
مفهموم partial class چیست ؟
این مفهموم از زمان وارد شدن .net 2 به بعد مطرح شد به این ترتیب که شما در یک فضای نام یکسان namespace می توانید اطلاعات کلاستتون را در دو یا بیشتر از دو فایل جداگانه قرار دهید . مشروط بر اینکه فضای نام namespaceهمه فایلها یکسان باشد . به مثال زیر دقت کنید . کلاسی داریم به نام myclass که می خواهیم آن را در 2 فایل تقسیم کنیم فایل اول به نام someclass و فایل دوم به نام moreclass است .
خوب همانطور که گفتم باید حتما فضای نام namespace هر دو فایل یکسان باشد حالا محتویات هر دو فایل را در زیر می آوریم
فایل someclass
Namespace space1{
public partial class myClass
{
public int P1 { get; set; }
}
}
فایل moreclass
Namespace space1{
public partial class myClass
{
public int P2 { get; set; }
public void ala()
{
//دستورات متد
}
}
}
همانطور که مشاهده می کنید بخشی از کد های کلاس myClass در یک جا و ادامه کدها در قسمت دیگری آمده است. از این ویژگی می توان برای گسترش کلاس ها استفاده کرد اما هر دو در یک فضای نام namespace قرار گرفته اند .
اما حالا که با این مفهوم آشنا شدیم سوال اساسی این است که فایده این روش در کجاست و چرا استفاده می کنیم ؟
1- افزایش خوانایی در کلاس های بسیار زیادی است/span>>/>/span>>/>
2- اگر شما بر روی کلاس پیچیده ای کار می کنید براحتی می توانید آن را بین چند نفر تقسیم کنید و هر کدام از افراد در فایلی جداگانه ، کدهای کلاس خود را می نویسد .
3- شما براحتی می توانید در جاهایی که برخی کدهای بصورت اتوماتیک تولید می شوند ،مثل کد فرمهای تحت ویندوز (Windows Forms, Web Service/span>>/>) ، را از کدهایی که شما بصورت دستی می نویسید را تفکیک کنید . در نتیجه اعمال تغییرات بسیار راحتتر می شود
4- در تعریف کلاسها می توانیم بخش از کلاس ما که دارای خصوصیات private را از بخش که دارای خصوصیات public باشه را تفکیک می کنیم این کار به خوانایی و روان فهمیدن کلاس کمک فراوانی می کند.
5- در تعریف interface ها شما می توانید تعریف interface را در یک فایل و رابطه ها و اعمال و پیاده سازیهای آن را در فایلی دیگر قرار دهید .