کاربردهای جنریک سی شارپ در یونیتی

بازگشت به آخرین اخبار بلوط گیمز

کاربردهای جنریک سی شارپ در یونیتی

فرض کنید میخواهید یک کار رایج مثل معکوس کردن آرایه (۱,۲,۳ => 3,2,1) را برای انواع داده ها مثل(int,float,string,…) انجام دهید، اگر به صورت عادی فکر کنیم باید برای هر نوع داده تابعی مخصوص به خودش را بنویسیم؛ اینجاست که جنریک به کمک ما می‌آید.

جنریک، به نوع داده ورودی کاری ندارد و هر چیزی میتوانیم به کلاس یا تابع تعریف شده بدهیم.

با توجه به این که نمی‌دانیم نوع داده ورودی چیست، فقط میتوانیم از مفاهیم پایه ای استفاده کنیم،

به طور مثال اگر ورودی را به صورت آرایه یا لیست گرفته ایم  میتوانیم از ویژگی های لیست یا آرایه مانند : حذف و اضافه , جابه‌جایی خانه ها و غیره استفاده کرد.

تعریف اولیه تابع یا کلاس جنریک به صورت زیر است:

 

از کلمه T به عنوان داده ی متغییر؛ استفاده میشود یعنی T میتواند(int,float,string,…) باشد و میتوان مانند متغییر های دیگر با T  رفتار کرد.

برای مثال با معکوس کردن آرایه شروع میکنیم :

هدف در این مثال، رسیدن به تابعی است که بتواند هر آرایه ای از انواع داده ها (int.float.sting,…) را معکوس کند.

به عنوان مثال آرایه از اعداد از ۱,۲,۳,۴,۵ به صورت ۵,۴,۳,۲,۱

و یا آرایه ای از حروف a,b,c,d  به صورت d.c.b.a  درآید.

خوب ابتدا تابع مان را تعریف میکنیم :

همانطور توضیح دادم با T  میتوان همانند متغیرهای دیگر رفتار کرد پس میتوانیم از آن به عنوان ورودی و خروجی تابع هم استفاده کنیم.

متغیر T را میتوانیم در تابع  یا کلاس تعریف شده استفاده کنیم و خارج از آن T  معنای خاصی ندارد.

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

از یک حلقه تکرار(For) برای پر کردن آرایه کمکی استفاده می‌کنیم.

هر بار خانه ( -(i+1)طول آرایه اصلی)  آرایه اصلی را در خانه i ام آرایه کمکی میریزیم.

در آخر هم آرایه کمکی را به عنوان خروجی تابع برمیگردانیم.

حالا میتوانیم هر آرایه ای را به راحتی برعکس کنیم :

اگر دقت کرده باشید در مثال بالا برای تابع اعداد از <int> استفاده شده  ولی برای حروف چیزی گذاشته نشده در این مثال چون محدودیتی روی T اعمال نکردیم با مشکلی مواجه نمیشویم،ولی بعضی مواقع لازم میشود محدودیت‌هایی رویT  اعمال شود، به عنوان مثال حتما نوع داده استفاده شده از کلاس خاصی ارث بری کرده باشد؛ اینجاست که نوع داده ورودی باید تعیین شود.

به مثال زیر دقت کنید :

فرض کنید در بازی  یک سری آیتم داریم مثله : اسلحه , زره و غیره… و میخواهیم یک لیست کلی از آیتم ها در بازی داشته باشیم.

روش پیاده سازی را به این صورت در نظر میگیریم:  یک کلاس آیتم و کلاس‌های اسلحه و زره که از کلاس آیتم ارثبری کرده اند.

همان طور که ذکر شد، در بازی یک لیست کلی آیتم که هر نوع آیتمی(اسلحه, زره,…)  را شامل میشود؛ داریم.

میخواهیم تابعی پیاده سازی کنیم که با دادن نوع آیتم (اسلحه,زره…) هر تعداد از آن نوع آیتم که در لیست وجود دارد را برگرداند.

کلاس های پیاده سازی شده در ادامه آمده است :

در تابع، نیاز داریم که داده ی انتخاب شده حتما از کلاس آیتم ارثبری کرده باشد؛ کد (where T : Item)  در پایان تعریف تابع این کار را برایمان انجام میدهد.

در ادامه یک لیست کمکی تعریف میکنیم تا نوع آیتم مورد نظر را در آن ذخیره کنیم.

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

اگر آیتم  از هم نوع بود آن را به لیست کمکی مان اضافه میکنیم.

در آخر نیز لیست کمکی مان را به عنوان خروجی تابع برمی‌گردانیم.

توجه داشته باشید که لیست items از قبل تعریف شده است.

خوب به عنوان مثال میخواهیم لیستی از اسلحه های موجود در لیست آیتم ها داشته باشیم :

از تابعی که در بالا پیاده سازی کردیم استفاده میکنیم و کلاس اسلحه به عنوان نوع داده به آن میدهیم.

چون اسلحه از کلاس آیتم ارثبری کرده است میتوانیم از آن استفاده کنیم.

توجه داشته باشید در اینجا مشخص کردن نوع داده مهم است و در غیر این صورت با ارور مواجه می‌شوید.

نویسنده: محمد مهدی خاجو

اشتراک گذاری پست

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

بازگشت به آخرین اخبار بلوط گیمز