کلاس ها و Generics در دارت
در کلاس ها نیز جنریک کردن دیتا ( وابسته کردن دیتا ) بسیار کاربردی است . برنامه نویسان ترجیح می دهند کلاس هایی که تولید می کنند از نوع داینامیک باشند تا قابلیت استفاده مجدد از این کلاس ها در سطح بالایی قرار بگیرند . ولی در هنگام استفاده از این کلاس ها ( در هنگام تعریف آبجکت ) اگر از جنریک ها استفاده نشود نمی توان بر نوع داده وارد شده از سمت کاربر نظارت کافی را لحاظ کرد و ممکن است کاربر به اشتباه مقادیر غیر مرتبطی را ثبت نماید که در ادامه فعالیت نرم افزار ایجاد خطا نماید . به عنوان مثال به قطعه کد زیر توجه نمایید :
void main() { var name = new Values(); name.addValues('Ali'); name.addValues('Hamed'); name.addValues(123); name.addValues(true); name.listValues.forEach((item){ print(item); }); } class Values{ var listValues = []; void addValues(var value){ this.listValues.add(value); } }
همان طور که مشاهده می نمایید در خط ۱۴ کلاسی به نام Values تعریف شده است و در خط ۱۵ این کلاس نیز متغییری از نوع لیست تعریف شده است که نوع مقادیر ورودی آن تعریف نشده است ، لذا کامپایلر دارت نوع dynamic را برای آن لحاظ خواهد کرد .
در خط ۱۷ نیز تابعی جهت دریافت ورودی از کاربر تعریف شده است که مقدار ورودی آن نیز نوع ندارد . به این روش برنامه نویسی کلاسی ایجاد کرده است که قابلیت تشکیل لیست از هر نوع داده ای را داراست .
در خط ۲ نیز متغییری از نوع کلاس new شده است و در خط های ۳ تا ۶ نیز به این متغییر مقدار دهی شده است ، ولی همان طور که مشاهده می کنید ، کاربر علاوه بر مقادیر String مقادیری نیز از نوع int و bool به متغییر داده است که هیچ خطایی در لحظه اجرا ایجاد نمی کند ولی قطعا در ادامه فعالیت نرم افزار ایجاد خطا خواهد کرد .
خروجی دستور فوق در تصویر زیر قابل مشاهده است :
جهت جلوگیری از این اتفاق ، باید کلاس مورد نظر را به نماینده نوع داده ای که کاربر در آینده تعریف خواهد کرد ، جنریک کنیم و سپس در لحظه new کردن آبجکت ، نیز نوع مورد نظر را اعلام نماییم . اصلاحیه کد بالا در زیر آمده است . لطفا به آن توجه نمایید :
void main() { var name = new Values<String>(); name.addValues('Ali'); name.addValues('Hamed'); name.addValues(123); name.addValues(true); name.listValues.forEach((item){ print(item); }); } class Values<T>{ var listValues = <T>[]; void addValues(T value){ this.listValues.add(value); } }
تغییری که در کلاس ایجاد شده است اینکه نام کلاس به نماینده نوع کاربر <T> جنریک شده است . همچنین متغییر لیستی که جهت نگهداری مقادیر کاربر پیش بینی شده بود و تابعی که جهت دریافت مقادیر کاربر ایجاد شده بود هر دو به نماینده نوع کاربر <T> جنریک شده اند .
در این مثال T نقش نماینده نوع کاربر را بازی می کند و یک عبارت اختیاری است و شما به جای T هر عبارت دیگری را ( به شرطی که جزء کلمات رزرو شده نباشند ) می توانید قرار دهید . خروجی دستور فوق را در شکل زیر مشاهده نمایید .
همان طور که در تصویر نیز مشخص است ، اگر کاربر تلاش نماید مقادیری غیر از نوع تعریف شده را در لیست ثبت نمایید با خطا مواجه شده و به این روش ما از یک دست بودن ورودی دیتا مطمئن می شویم .
امیدوارم این مطلب برای شما مفید باشد . در صورت تمایل می توانید به سایت مرجع دارت نیز در این آدرس مراجعه و اطلاعات بیشتری کسب نمایید .