کلاس ها و Generics در دارت

تعداد بازدید ها : 1,427 بازدید
 کلاس ها و 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 به متغییر داده است که هیچ خطایی در لحظه اجرا ایجاد نمی کند ولی قطعا در ادامه فعالیت نرم افزار ایجاد خطا خواهد کرد .

می خوانم   ویجت Container

خروجی دستور فوق در تصویر زیر قابل مشاهده است :

خروجی دستور جنریک کلاس

جهت جلوگیری از این اتفاق ، باید کلاس مورد نظر را به نماینده نوع داده ای که کاربر در آینده تعریف خواهد کرد ، جنریک کنیم و سپس در لحظه 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 هر عبارت دیگری را ( به شرطی که جزء کلمات رزرو شده نباشند ) می توانید قرار دهید . خروجی دستور فوق را در شکل زیر مشاهده نمایید .

خروجی دستور جنریک کلاس

همان طور که در تصویر نیز مشخص است ، اگر کاربر تلاش نماید مقادیری غیر از نوع تعریف شده را در لیست ثبت نمایید با خطا مواجه شده و به این روش ما از یک دست بودن ورودی دیتا مطمئن می شویم .

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

2+
محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم . بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید . آدرس ایمیل : info@javareshkian.ir

ارسال یک پاسخ

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

17 − یک =