جلسه هفدهم >>ادامه جنریک ها یا ای او سی سطح 4

ای او سی طح چهارمون این بود که چطوری نوع داده رو بفرستیم داخل یه دونه کلاس قبلش یه نمونه از اون نوع داده رو میفرستادیم مینوشتیم استودنت اس بعد اس رو میفرستادیم داخل یه دونه کلاس یا یه دونه تابع یه دونه هر چیزی حالا به جایی اینکه اس بفرستیم خود نوع داده رو میخوایم بفرستیم و ازش استفاده کنیم :تا اینجا این رو میفرستادیم :توی جنریک ها میخوایم خود نوع داده رو بفرستیم ن اینکه متغیری از اونبرای شروع کارمون رفتیم از رازی ارری لیست شروع کردیم گفتیمتوی رازی ارری لیست کاری که ما داریم انجام میدیم وابسته بود استودنت ارری لیست بود یا شیپ ارری لیست بود اومدیم روشون کار کردیم فکر کردیم دیدیم که خیلی وابسته است این الان به یه نوع داده خاص وابسته است . من هر نوع داده دیگه ای که بخوام بسازم و ارری لیستی برای اون نوع داده داشته باشم باید اون ارری لیست رو از اول برای اون نوع داده بسازم . ارایه پویا ازش داشته باشم .هرچند ما توی جاوا داریم . ما داریم منطق اون و بیس کارشه و خب اومدیم این رو توسعه اش دادیم چیکارش کردیم ؟برای شروع کار از نوع ابجکت تعریفش کردیم وقتی ابجکت تعریفش میکنیم چه اتفاقی میفته ؟ هر نوع داده ای رو میتونی داخلش قرار بدی پس من الان یه ارری لیست دارم همه چی میشه توش قرار داد همه چی میشه توش قرار داد . یعنی این کار رو انجام بدیمتی ها رو به ابجکت تغییر داد استاد چون که برای کلاس قبلی توضیح داده بود و کد ها رو کامل کرده بود و برای اموزش به ما دوباره تی ها رو حذف کرد و ابجکت قرار داد .خب این الان خیلی عالیه شما الان میتونید بیاید و بنویسید رازی ارری لیست مساوی با نیو ارری لیست این گام اولمونخیلی عالیه الان هرچیزی میپذیره دیگه پس اون مشکلمون حل شد من میگم دات اد و مثلا یه رشته به من بده این میشه رازی ارری لیستی که همه چی میشه داخلش قرار داد مشکلی نداریم باهاش که بگیم الان حتما سیرکل باشه یا استودنت باشه یا هرچیزی الان همه چی رو میپذیره مثل دفعه قبلی وابسته نیست اما مشکل داره و مشکلش اینه که ما نمیخوایم همه چی رو هم بپذیرهاز یه طرف میخوایم که همه چیز رو بپذیره از یه طرف هم نمیخوایم همه چیز رو بپذیره یعنی در واقع هر دو رو میخوایم هر دو کاربردش رو میخوایم میخوایم که یه جاهایی رو بتونم همه چی رو بپذیره برام اما یه جاهایی هم ممکنه نیاز داشته باشم که به طور خاص یه چیز هایی رو بپذیرم مثلا چی حالا فرض کن من اینجا یه متد دارم حالا ممکنه این متده تو یه کلاس دیگه باشه من اینجا مینویسمش برای سادگی میگم وید تستو میخوام با یه لیستی از ابجکت های نوعی خاص مثلا کار کنم .مثلا چی فرض کنید که میخوام رازی اریرری لیست رو بنویسم و این داخل یه حلقه بزنم و این تستم فقط وفقط با استودنت ها کار کنه و من میتونم الان بیام و بگم استودنت فرض کنید اسالان فرض کن اینجا استودنت اضافه شده یه دونه از این استدونت ها رو اضافه میکنم میپذیره دیگه عمومی هم هست همه چی رو میپذیره خب من الان یه دونه استودنت دارم داخل رازی اینجا مینویسم رازی استودنت اس داخل رازی ارری لیست بهم ارور میدهاها این رازی ارری لیست قابل فور ایچ نیست چون ایتریبلش نکردیم من این رو اینجوری بنویسم مینویسم ای مساوی است با صفرای کوچیکتر از رازی ارری لیست دات سایز و ای پلاس پلاس . بعدش میام مینویسم استودنت اس مساوی است با رازی ارری لیست دات گت ای ام رو بهم بده بعد اس دات و بعد سیستم دات اوت اس دات گت اوریجش خب اینجا بهم ارور میده من استدونت قرار دادم هاولی این که نمیدونه من استودنت قرار دادم این خودشم مطمئنه که استودنت قرار داده کستش میکنهاونی که این رو نوشته میدونه صد در صد قراره با استودنت ها کار کنه کستش میکنه ممکنه اینجا اشتباهاا ممکنه اصلا به صورت کتابخانه بدی دست مردم دیگه بیاد بزنه مثلا یه رشته ایاینم میپذیره اولی رو میاد کست میکنه و درست چاپ میکنه میرسه به دومی میخواد کستش کنه استرینگه به استودنت ارور میده بهتونپس اینجا من واقعا خودم میخوام که داده ای که وارد این میشه صدرصد از نوع استودنت باشه نمیخوام یه ارری لیستی داشته باشم که همه چی توش باشه میخوام یه ارری لیستی داشته باشم بتونه فقط استودنت توش باشه اما از اون طرف هم من فقط میخوام یه دونه ارری لیست داشته باشم که همه چی بتونم براش تعریف کنم ارری لیستی از ابجکت ها ارری لیستی از استودنت ها ارری لیستی از سیرکل ها ارری لیستی از استرینگ ها و از هر چیزی ن اینکه صد تا ارری لیست بنویسم اگه یه دونه یه دونه بنویسم که که خاص میشه و این مشکل حل میشه اما از طرفی اگه یه دونه یه دونه بنویسم برای هر کداام از نوع های داده باید یه دونه از این ها بنویسم اگر بیام ابجکتش کنم خب این مشکل برام به وجود میادپس من باید یه کار دیگه بیام و انجام بدم کاری که ما انجام میدیم از ای او سی سطح 4 اش استفاده میکنیم و جنریک هامیگیم این رو ابجکت تعریف کن که همه چی بگیره اما ورودی و خروجیت رو محدود کن چطوری ؟این ورودیته تی اش کناین خروجیته تیش کنهو اینم کستش کناین شد ورودیماین هم شد خروجیمحالا چه خوبی ای داره برای من ؟اگه من بنویسمش خب این همون چیزی بود که قبلا داشتیم از ابجکت اگه بخوام خصوصیش کنمکافیه اینجا بنویسم که این از نوع استودنته دیگه اصلا نیازی ندارم به کست کردن صدرصد استودنت وارد اینجا میشه همین رو مستقیم میتنم اینجا بزارمو این رو هم اگه بنویسم استودنت دیگه رشته رو هم ازم قبول نمیکنه چون اگه الان قبلیه رو تست اگه بزنم رازی ارری لیست رو ازم میپذیره ن رازی ارری لیست ابجکت رو این رو اگرم بیاد داخل بهم ارور میدهاین رو هم بذارید که مشکل ساز نشهتست رازی ارری لیست این میاد داخل ادد میکنه دانشجو رو و ایتم های دگیه رو اصلا به هیچ عنوان نمیپذیره به هیچ عنوان آیتم دیگه ای رو ازت نمیپذیره فقط استودنت رو ازت میپذیرهخب پس این تا اینجا شد یه ارری لیستی که خیلی دیگه هم عمومیه و هم محدود شده است یعنی هر دو تا رو داره ورودیش کنترل شده است خروجیش هم کنترل شده است و نوعش هم همه چی میتونه داخل قرار بگیره این شد جنریک هامون برای رازی ارری لیستمون بعدش اومدیم برای رازی سورت گفتیم رازی سورت باید چطوری باشه باید از نوع تی باشههمه رو به نوع تی تبدیل کردیم به این صورتخب چرا این کار رو انجام دادیم ؟چون که اگه برگردیم از جلسه اول یه مرور کنیم در مورد سورت جلسه اولی که اومدیم سورت رو بررسی کردیم اولش اومدیم مثلا برای سیرکل اومدیم این کار رو انجام دادیم گفتیم ما یه سورت مینویسم که فقط دایره ها رو مرتب میکنه این گام اول و گفتیم این وابسته است و این خوب نیست اومدیم یه مرحله بهترش کردیم گفتیم یه سوپر کلاس تعریف میکنیم بهاسم شیپ و زیر مجموعه ای از شیپ های مختلف داریم سیرکل داریم رگتنگل داریم تری انگل درایم و همه این چیزهای مختلف رو اومدیم در نظر گرفتیم و سورتمون رو بجای اینکه با اون نوع های خاص تعریف کنیم اومدیم با چیز عمومی تر شیپ تعریفش کردیم و یه مرحله بهتر شد و ما یه مرتب سازی داشتیم که همه شکل ها رو میومد برای ما مرتب میکرد شد ای او سی سطح دو و یک بعدش گفتیم این هنوز مشکل داره اگر من بخوام شکل ها رو بر اساس مساحت مرتبشون کنم و یه دونه از این شکل ها نیومده باشه و اریا شو پیاده سازی کنه میاد اریا ی شیپ رو به ارث می بره و اریای شیپ هیچی توش نبود شیپ فقط یه مفهوم بود و اصلا مساحتی نداره متد رو داره اما هیچی توش انجام نمیشه تا زمانی که نوع شکله مشخص نشه کدومتون میتونید مساحت حساب کنید اصلا نمیتونید گفتیم میایم و یه مرحله بهترش میکنیم عمومی سازیه رو انجام میدیم همون جوری که قبلا انجام دادیم اما یه خورده قوانین رو هم براش در نظر میگیریم شد کلاس های انتزاعی و و اجبار روی پیاده سازی یه سری متد ها مثلا گفتیم هر کسی شیپ باشه باید خودش اریاشو پیاده سازی کنه که ابهام وجود نداشته باشه باز اومدیم جلو تر دیدیم با اینکه این خیلی خوب شد اما هنوز هم مشکل داره مشکلش اینه که من نوع های مختلفی میخوام قرار نیست که شکل مرتب کنم اگه بخوام انسان رو مرتب کنم چی بر اساس یه سری ویژگیشون اگه بخوام یه ابجکت دیگه ای هر چیز دیگه ای مرتب کنم چی اونا که زیر مجموعه شیپ نیستند خب یه دونه سوپر کلاس اصلی هم برای همشون بذارم باز که به دردم نمیخوره خب بی نهایت ویژگی مقایسه ای مختلف توی این کلاس های زیر مجموعه وجود داره بر اساس کدومش بخوام مقایسه کنم اصلا همچین چیزی عملی نیست گفتیم برای اینکه بهترتش کنیم حرف نوع نزنیم نوعش رو بزاریم کنار نوع داره اصلا اونا رو هم بذاریم کنار بجاش قانون تعریف کنیم بگیم هر کلاسی این قانون رو رعایت کرد میتونه نمونه هاش رو بفرسته داخل کلاس سورت و مرتبش کنه شد اینترفیس ها یا ای او سی سطح سوم هر کلاسی قوانین رو رعایت کرد ما میتونیم لیسیی از نمونه های مختلف اون نوعع داده رو بفرستیم داخل کلاس ها اون قانونمون اسمش چی بود ؟ اسمش رو گذاشته بودیم کمپیربل که داخش باید متد کمپیر داشته باشه یا مثلا کمپریتور یا بقیه چیز هایی که یاد گرفتیم این شد گام بعدیمون حالا امروز دارم چی بهتون میگم ؟ امروز دارم بهتون میگم یه مرحل باید بهترتش کنیم مشکلش چیه ؟ ابهام داره هنوز ابهامش چیه ؟ ابهامش اینه که این داره میگه که هر چیزی که کمپیربل باشه میتونه با هم مقایسه بشه مگه اینطوریه ؟تو دنیای واقعیمون مگه اینطوریه مگه اصلا همچین چیزی نیست تو دنیای واقعیمون کاریکه ما داریم انجام میدیم اینه که این انسان ها با هم مقایسه میشن اون لیوان ها با هم مقایسه میشن و اینکه اگر دو تا ابجکت از دو دنیای مختلف با هم مقایسه بشن میگیم این ها با هم میتونن مقایسه بشن میگم این با اون مقایسه میشه این با اون یعنی درواقع حرفی که درایم میزنیم اینه که مثلا فلان ابجکت قابل مقایسه است با یک ابجکت دیگه حالا اون ابجکت دگیه یا از نوع خودشه یا از نوع ابجکت های دیگه است مثلا میگم لیوان با لیوان مقایسه میشه بر اساس ارتفاع مثلایا اینکه میگم ن لیوان با مثلا بشقاب مقایسه میشه یا انسان با ماشین مقایسه میشهاز یه حالت دیگه هم دارم اختصاصیش میکنم میگم لیوان ها فقط وفقط با لیوان ها خود دارم میگم اما خب این قابلیت رو هم دارم بگم این لیوانه با یه چیز دیگه چیزی که الان میخوایم درباره اش حرف بزنیم یا اینکه جلسه قبلی هم درموردش حرف زدیم اینه که هرکی با هرکی نباشه همه چی با همه چی اگه قراره چیزی با چیزی باشه خودم بگم اگر خودم نگم ابهام به وجود میاد چطوری ابهام به وجود میاد ؟ مثلا من اینجا استودنت دارم گفتم این کمپیربله از اون طرف هم سیرکل دارم اینم نمیگم .بعدش میام اینجا اینم نمیگم یه همچین چیزیاینم استودنتهحالا من لیسیتی از دایره ها و دانشجو ها رو با هم قاطی شون کردم میخام مرتبشون کنم همه رو با هم قاطی کردم حالا میخوام مرتبشون کنم خب فرض کنیم همشون استودنت اند یه دونه هم دایره افتادن توشوناینطوری تا مشخص هم باشهخب استوتدنت ها خیلی راحت با هم کست میشن و میتونم کستشون کنم و با هم مقایسه شون کنم و نتیجه انجام بشن و هیچ مشکلی ندارم اما به محض اینکه می خورن به سیرکله خب این مشکل داره برای من اینجاست که اتفاقات ناخوشایند میفته و این ارور میده و یا مثلا این ور فرض کن این همشون سیرکلن و یه دونه استودنت افتاده بینشون حالا میای مقایسه میکنی همه رو تبدیل میکنه میرسه به استودنته نمیتونه تبدیلش کنهارور بهم میده میرسه به استودنته ارور بهم میده خب حالا این رو من چیکارش کنم این ابهام رو چطوری حل کنم ابهام اینطوری حل میشه که من خودم بگم که چی با چی مقایسه بشه مثلا اگر منبگم این قابل مقایسه است با استودنته ابعدش اینجا باید بیام و حتماخب این رو میاد برای من استودنت میزنه اگر حالا نوع دیگه ای بزنم مثلا سیرکل بزنم از من قبول نمیکنهمیگه باید حتما استودنت باشه خب من اگر استودنت رو بزنم این ازمقبول میکنه حالا اینجا میام این رو دیگه نمیتونم بیام تبدیلش کنم به دایره و این رو تبدیلش میکنم به استودنت و میگم اریا این با استودنت مقایهس بشهحالا اینیه چیز بی معنی ای هستش ها ولی خب من اینجوری میخوامکی میاد دایره رو با استودنت مقایسه کنههمچین چیزی که نیست البته باز این مشکلاتی داره ها به این سادگی ها حل نمیشه کلیتش رو دارم میگم چون که دو طرفه است ممکنه استودنت با دایره مقایسه بشه یا برعکسپس این هنوز جواب نمیده به ما ولی خب من کلیتش رو بهتونو دارم میگم خبولی از این ور مثلا برای استودنت هاموندقیقا همینطورمیگم کامپیربل هم استودنت باشه بعد این باید بیاد از نوعاستودنت باشه که این رو تبدیلش میکنه به اوریج و تمام مشکلی ندارهپس از اون طرف داخل رازی سورتمون الان کمپیربل بودن بر اساس نوعیه که مشخصه چیه و الان اجازه نمیده که نوع مختلفی مثلا با هم مقایسه بشن مگر اینکه از اون نوع کمپیربل باشهمثلا اگر دایره از نوع استودنت کامپیربل باشه این قبول نمیکنه ولی خب باید از این نوع کمپیربل باشه خب این شد نکته دوممون که اومدیم و این کار رو انجام دادیم لیست یوتیلیتی مون هم که خیلی واضح و روشن بود چیز خاصی نداشت فقط همین کمپریتورش که که اونم صحبت کردیم اما یه نکته داشت که اونم گتفم بعدا بهتون میگگم اینکه این ها رو چطوری بیام و جنریک کنمبهتون میگم این ها روخب این ها چیز هایی بود که از جلسه قبل داشتیم مطلبی که میخوام الان بهتون بگم جدیده خیلی با دقت گوش کنید یه خورده شاید سنگین تر از مطالب قبلی باشه خیلی خیلی با دقت گوش کنید خیلی خیلی مهمه میگم یه کوچولو شاید سنگین تر از مطالب قبلی باشه اون چیه اون مطلب ؟اون چیزی که میخوایم درموردش حرف بزنیم ؟برای مرتب سازیاین رو قبلا یاد گرفتیم دیگه اگه من از نوع استودنت این ها رو تعریفشون کنم چندن تا داده داخلش قرار بدم بدم به ایتم و رازی سورت این رو برای من سورتش میکنه و هیچ مشکلی هم یپش نمیاد چون گفته ارریلیسیتتی از کمپیربل ها رو میپذیرم درسته ؟خب استودنتم هم مگه کمپیربل نیست ؟خود استودنت هم کمپیربله پس ارایه ای از استودنت ها هم میشه ارایه ای از کمپیربل هامشکل کجا پیش میاد ؟مشکل زمانی یپش میاد کهارایه رو بردارم و ارری لیستش کنماینم باید ارری لیستش کنیملنگت ها به سایز تبدیل میشن چون دیگه ارری لیست چیز نداره میشن سایز و بقیه هم باید از ارایه خارج بشن و لیست اکسسز میشنهمه این ها رو این مدلیش میکنیم حالا یه ارور بهمون میده خب دیگه باید هم ارور بده درسته ؟ارایه است اون ارری لیسته استودنت رو باید تبدیل کنم به ارری لیستبه این صورتو اینم بنویسم نیو ارریلیستاینم اینطوری ننویسمش بنویسسم ادد کنه خب . .اما حل نشد بازمهنوزم داره ارور میده مگه همه چی الان درست نیست ؟ انگار همه چی حله من همه چی رو درست نوشتم گفتم ارری لیستی از کمپیربل ها اینم ورودییم که ارری لیسیتی از کمپیربل هاست . استیودنت کمپیربله از نوع استودنتاز این ور هم این تی رو اینجا دارم اینم گفتم رازی از نوع استودنته پس وقتی میاد داخل این استودنت میشه پس این هم میشه ارری لیستی از کمپیربل های استودنتی خب منم الان همین کار رو انجام دادماین رازیاین استودنت هم همون کمپیربل از نوع استودنته دیگه پس چرا داره هنوز بهم ارور میده ؟در واقع تشخصیش میده اما نمیتونه تبدیلش کنه به چی تبدیلش کنه به ارری لبیست کمپیربل از نوع استودنت نمیتونه تبدیلش کنه به ارری لیستی از نوع کمپیربل از نوع استودنتی نمیتونه این رو تبدیل کنه چر انمیتونه این رو تبدیلش کنهبخاطر اینکه من هم از ااون ارری لیست خودمون استفاده میکنم برای توضیح دادنش اون ساده تره حالا بریم داخل این یه خورده داستانش زیااد ترهاین ارری لیست خودمون خب چطوری تعریفش کردیم ؟اومدیم این بالا نوشتیم پابلیک کلاس از نوع تیمهم مهم مهم مهمخیلی با دقت گوش کنید . این واقعا خیلی مهمهرازی ارری لیست از نوع تی رو من اینجا نوشتم داخل جاوا و حالا این جنریک هایی که توش استفاده میشه وقتی شما مینویسید رازی ارری لیست از نوع تیبعد یه دونه تی میاد اینجا قرار میگیره مثلا استودنت قرار میگیره مثلا فرض کن همین الان رازی ارری لیستهرازی ارری لیست از نوع استودنت و استودنت اومده داخلاستودنت اینجا قرار میگیره انگار شما همچین کلاسی رو تتعریف کردیناین اتفاق نمیفته ها میگم انگار اینطوریهبعد کلاس میسازه ازش براتون انگاری اینطروی میشه در این متد ادش مثلا میاد میشه استودنتاینطوری انیشکلی انگار میشه یه کلاس برات تعریف میکنه و بقیه جززیاتش اون پایین داره اتفاق میفته بعد خب منخب نوشتم ارری لیست از نوع استودنت ها خب پس این شد اولیارری لیست از نوع استودنت ها شد اینو شد این اما میام توی رازی سورتتوی رازی سورت نوشته چی ؟ گفته پرایویت ارری لیست کمپیربل از نوع تی تی هم که من فرستادم داخل از نوع استودنته پس اتفاقی که میفته انگار یه همچین چیزی میشه یعنی یکی دیگه از همین انگار تولید میشهاینش کمپیربله و استودنت هم میره تو دایموندش یه کلاس اینطوری تعریف میشهاینم بیارم بزارم این قسمتانگار دقیقا همچین کلاسی تعریف میشهتوی تابع مینمون شد دومی :توی رازی سورتموناین تعریف شده اولی خب حالا پس داخل رازی سورت من دارم از این کلاس متغیر تعریف میکنم اما توی میندارم از این یکی کلاس میفرستم تو خب این پایینی رو نمیتونه تبدیل کنه به بالایی در چه صورتتی میتونست برام تبدیل کنه ؟در صورتی که من میومدم این دومی رو اینطوری مینوشتم :یعنی اگر این اتفاق میفتاد میگتم رازی ارری لیست از نوع استتودنت اکستند اکستندی باشه ازرازی ارری لیست از نوع کمپیربل استودنت اگر این رو اکستند میکردم میتونست این رو بیاد برای من تبدیل کنه به این یکی و بزاره داخل این لیستم و مشکلم حل شه پس مشکل بخاطر نوع تعریف کلاس هامونه که توی جنریک ها اتفاق میفته من نیومدم بگم که رازی ارری لیست از نوع استودنت زیر مجموعه رازی ارری لیست از نوع کمپیربل استودنته من گفتم خود استودنت اکستندی از نوع کمپیربل استودنته خب خودش چه ربطی به این رازی ارری لیستم داره ؟؟اما توی ارایه ها اینطوری نبود توی ارایه ها خب کلاسی تعریف نمیشد توی اارایه ها من از اون ور استودنتی به صورت ارایه داشتم و از اون ور هم کمپیربل داشتم و اگر استودنت ها همشون کمپیربل بودن میتونست اونا رو بندازه داخل برام کلاس جدیدی تعریف نمیشد همون داده بود فقط ارایه بود میفرستاد داخل امااما تو جنریک ها انگار واقعا یه کلاس جدیدی تولید میشهبا این اسم طولانیش و این رو من گذاشتم توی گذرگاهم الان من توی این گذرگاهماین رو گذاشتمبعد سعی دارم این رو بفرستم داخل ولی چون این زیر مجموعه اش نیست اصلا نمیپذیره ازم و بهم ارور میده حالا برای حلش باید چیکار کنمکاری که باید انجام بدیم اینه که یه همچین کاری باید انجام بدیم :این رو جنریکش کنم به همین شکلی که هست امااین رو اینطوری ننویسم و تبدیل به تی اش کن ماین رو هم تی بزنم الان میگم چرا باید این کار رو انجام بدی ماین رو هم تی بزنیم :و مشکل حل میشه ارورش حل میشه چراحل شد ؟دلیلش این چیزیه که بهتون میگممن گفتم رازی سورت از نوع استودنت اتفاقی که میفته اینهاستودنت رو میاد میذاره اینجاهمه این ها رو استودنت میذارهپس وقتی که من این استودنت رو اینجا گذاشتمرازی سورت میاد و همه این ها رو استودنت میکنهخب من گفتم چی رو بفرست تو ؟ارری لیستی از استودنت ها رواین چیه ؟ ارری لیستی از استودنت هاو به همین سادگی حل شد