حسین کعبی: وقتی فیگو را در جام جهانی زدم....
اگر قبلا با ++C برنامه نوشته باشید با مفهوم Template آشنا هستید، اما برای کسانی که با این مفهوم آشنا نیستند توضیحی مختصر خواهیم داد.
واژه Template در فارسی به معنی قالب است. بعضی وقتها نیاز دارید کلاس خود را به یک قالب خاص ببرید. این به معنی آن است که شما در کلاس خود یکسری الگو و ویژگی عمومی دارید.
مثلا یک آرایه میتواند عدد، رشته یا از یک نوع کلاس یا ساختاری باشد که برنامهنویس تعریف کرده است. اما در همه این حالتها اندازه آرایه به یک روش به دست میآید و اگر قرار باشد به آرایه یک مقدار اضافه شود به یک روش اینکار انجام میشود. برای همین شما میتوانید یک کلاس مجموعه را که نشاندهنده یک آرایه است تعریف کنید و به آن بگویید برای این نوع داده کارهای خود را انجام بدهد. اگر بخواهیم در دنیای واقعی یک مثال از Generic بزنیم میتوان کلاسهای Generic را مشابه یک لیوان تصور کرد. شما در لیوان میتوانید آب، نوشابه، چای یا قهوه بریزید. چیزی که به یک لیوان ماهیت میدهد، مادهای است که درون آن قرار دارد. شما میگویید یک لیوان آب بدهید یا یک لیوان چای و...
فرض کنید یک کلاس Stack داریم و قرار است عملیات Push و Pop را انجام دهیم. میخواهیم این کلاس را برای اعداد صحیح و رشتههای متنی و ... تعمیم دهیم. سادهترین راه، نوشتن یک کلاس Stack برای هر نوع داده است، اما اینکار اصلا منطقی نیست. راه سادهتر دیگر تعریفکردن یک کلاس Stack با نوع داده (object) است، چرا object؟ تمامی دادهها در سیشارپ از کلاس object ارثبری میکنند؛ پس راحتترین راه، استفاده از این داده است. اما این راه یک مشکلی دارد و آن، اینکه هر بار بخواهید یک بخش از Stack را بخوانید، باید آن را به نوع داده مورد نظر خود تبدیل کنید. دادههای درون Stack میتواند هر نوعی باشد یعنی یک بخش از نوع رشته متنی و دیگری از نوع عدد صحیح باشد.
Stack stack = new Stack();
stack.Push(200);
stack.Push("Click!");
int text = (int)stack.Pop();
کد زیر خطای زمان اجرا دارد، زیرا میخواهد بخشی را که از Stack آورده به یک عدد صحیح تبدیل کند و از آنجا که آخرین بخش درون Stack مقدار رشتهای Click را دارد، اینکار با خطای در حال اجرا روبهرو میشود؛ پس در استفاده از این روش باید دقت کامل به خرج دهید و بدانید چه نوع دادهای در Stack قرار دارد.
اما در نسخه دوم #C با ارائه مفهوم Generic این مشکلات حل شده است و شما میتوانید مشخص کنید دادههای درون Stack از چه نوعی باشد، در واقع کلاس Stack را به قالب یک نوع داده دیگر میبرید. در سیشارپ 2 به بعد شما میتوانید هم کلاس Generic داشته باشید هم متد Generic. برای نشان دادن Generic بودن از علامت « » استفاده میشود، به کد زیر دقت کنید:
Stack«int» stack_ints = new Stack«int»();
stack_ints.Push(22);
int data = stack_ints.Pop();
مقدار data برابر 22 است، همانطور که مشاهده میکنید برای اینکه دادهها را از Stack بخوانیم به تبدیل نوع داده نیازی نداریم. اما مزیت دیگر آن، این است زمانی که میخواهید دادههای خود را از Stack بخوانید نیازی به تبدیل نوع داده نیست. در مثال بالا تلاش برای قراردادن یک رشته متنی در Stack با خطا مواجه میشود.
با مفهوم اصلی Generic آشنا شدیم، حالا میخواهیم یک کلاس ساده که یک آرایه را در خود جای داده است به صورت Generic تعریف کنیم. به کد زیر دقت کنید:
class Test«T»{
T[] items;
public Test«T»(T[] items){
this.items = items;
}
public int getLenght(){
return items.Length;
}
}
این کلاس میتواند یک آرایه از نوع int یا string یا هر نوع داده دیگری را در خود جای دهد.
تا به اینجا با مفاهیم اولیه Genericها در C# آشنا شدیم، در شماره بعدی در مورد الگوهای Generic و بقیه مباحث مربوط به Generic خواهیم پرداخت.
امیر بهاءالدین سبطالشیخ
حسین کعبی: وقتی فیگو را در جام جهانی زدم....