Amir_B
Amir_B
خواندن ۱۶ دقیقه·۳ سال پیش

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

ای او سی طح چهارمون این بود که چطوری نوع داده رو بفرستیم داخل یه دونه کلاس قبلش یه نمونه از اون نوع داده رو میفرستادیم مینوشتیم استودنت اس بعد اس رو میفرستادیم داخل یه دونه کلاس یا یه دونه تابع یه دونه هر چیزی حالا به جایی اینکه اس بفرستیم خود نوع داده رو میخوایم بفرستیم و ازش استفاده کنیم :

تا اینجا این رو میفرستادیم :

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

برای شروع کارمون رفتیم از رازی ارری لیست شروع کردیم گفتیم

توی رازی ارری لیست کاری که ما داریم انجام میدیم وابسته بود استودنت ارری لیست بود یا شیپ ارری لیست بود اومدیم روشون کار کردیم فکر کردیم دیدیم که خیلی وابسته است این الان به یه نوع داده خاص وابسته است . من هر نوع داده دیگه ای که بخوام بسازم و ارری لیستی برای اون نوع داده داشته باشم باید اون ارری لیست رو از اول برای اون نوع داده بسازم . ارایه پویا ازش داشته باشم .هرچند ما توی جاوا داریم . ما داریم منطق اون و بیس کارشه و خب اومدیم این رو توسعه اش دادیم چیکارش کردیم ؟

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

تی ها رو به ابجکت تغییر داد استاد چون که برای کلاس قبلی توضیح داده بود و کد ها رو کامل کرده بود و برای اموزش به ما دوباره تی ها رو حذف کرد و ابجکت قرار داد .

خب این الان خیلی عالیه شما الان میتونید بیاید و بنویسید رازی ارری لیست مساوی با نیو ارری لیست این گام اولمون

خیلی عالیه الان هرچیزی میپذیره دیگه پس اون مشکلمون حل شد من میگم دات اد و مثلا یه رشته به من بده این میشه رازی ارری لیستی که همه چی میشه داخلش قرار داد مشکلی نداریم باهاش که بگیم الان حتما سیرکل باشه یا استودنت باشه یا هرچیزی الان همه چی رو میپذیره مثل دفعه قبلی وابسته نیست اما مشکل داره و مشکلش اینه که ما نمیخوایم همه چی رو هم بپذیره

از یه طرف میخوایم که همه چیز رو بپذیره از یه طرف هم نمیخوایم همه چیز رو بپذیره یعنی در واقع هر دو رو میخوایم هر دو کاربردش رو میخوایم میخوایم که یه جاهایی رو بتونم همه چی رو بپذیره برام اما یه جاهایی هم ممکنه نیاز داشته باشم که به طور خاص یه چیز هایی رو بپذیرم مثلا چی حالا فرض کن من اینجا یه متد دارم حالا ممکنه این متده تو یه کلاس دیگه باشه من اینجا مینویسمش برای سادگی میگم وید تست

و میخوام با یه لیستی از ابجکت های نوعی خاص مثلا کار کنم .مثلا چی فرض کنید که میخوام رازی اریرری لیست رو بنویسم و این داخل یه حلقه بزنم و این تستم فقط وفقط با استودنت ها کار کنه و من میتونم الان بیام و بگم استودنت فرض کنید اس

الان فرض کن اینجا استودنت اضافه شده یه دونه از این استدونت ها رو اضافه میکنم میپذیره دیگه عمومی هم هست همه چی رو میپذیره خب من الان یه دونه استودنت دارم داخل رازی اینجا مینویسم رازی استودنت اس داخل رازی ارری لیست بهم ارور میده

اها این رازی ارری لیست قابل فور ایچ نیست چون ایتریبلش نکردیم من این رو اینجوری بنویسم مینویسم ای مساوی است با صفر

ای کوچیکتر از رازی ارری لیست دات سایز و ای پلاس پلاس . بعدش میام مینویسم استودنت اس مساوی است با رازی ارری لیست دات گت ای ام رو بهم بده بعد اس دات و بعد سیستم دات اوت اس دات گت اوریجش خب اینجا بهم ارور میده من استدونت قرار دادم ها

ولی این که نمیدونه من استودنت قرار دادم این خودشم مطمئنه که استودنت قرار داده کستش میکنه

اونی که این رو نوشته میدونه صد در صد قراره با استودنت ها کار کنه کستش میکنه ممکنه اینجا اشتباهاا ممکنه اصلا به صورت کتابخانه بدی دست مردم دیگه بیاد بزنه مثلا یه رشته ای

اینم میپذیره اولی رو میاد کست میکنه و درست چاپ میکنه میرسه به دومی میخواد کستش کنه استرینگه به استودنت ارور میده بهتون

پس اینجا من واقعا خودم میخوام که داده ای که وارد این میشه صدرصد از نوع استودنت باشه نمیخوام یه ارری لیستی داشته باشم که همه چی توش باشه میخوام یه ارری لیستی داشته باشم بتونه فقط استودنت توش باشه اما از اون طرف هم من فقط میخوام یه دونه ارری لیست داشته باشم که همه چی بتونم براش تعریف کنم ارری لیستی از ابجکت ها ارری لیستی از استودنت ها ارری لیستی از سیرکل ها ارری لیستی از استرینگ ها و از هر چیزی ن اینکه صد تا ارری لیست بنویسم اگه یه دونه یه دونه بنویسم که که خاص میشه و این مشکل حل میشه اما از طرفی اگه یه دونه یه دونه بنویسم برای هر کداام از نوع های داده باید یه دونه از این ها بنویسم اگر بیام ابجکتش کنم خب این مشکل برام به وجود میاد


پس من باید یه کار دیگه بیام و انجام بدم کاری که ما انجام میدیم از ای او سی سطح 4 اش استفاده میکنیم و جنریک ها

میگیم این رو ابجکت تعریف کن که همه چی بگیره اما ورودی و خروجیت رو محدود کن چطوری ؟

این ورودیته تی اش کن

این خروجیته تیش کنه

و اینم کستش کن

این شد ورودیم

این هم شد خروجیم

حالا چه خوبی ای داره برای من ؟اگه من بنویسمش خب این همون چیزی بود که قبلا داشتیم از ابجکت اگه بخوام خصوصیش کنم

کافیه اینجا بنویسم که این از نوع استودنته دیگه اصلا نیازی ندارم به کست کردن صدرصد استودنت وارد اینجا میشه همین رو مستقیم میتنم اینجا بزارم


و این رو هم اگه بنویسم استودنت دیگه رشته رو هم ازم قبول نمیکنه چون اگه الان قبلیه رو تست اگه بزنم رازی ارری لیست رو ازم میپذیره ن رازی ارری لیست ابجکت رو این رو اگرم بیاد داخل بهم ارور میده

این رو هم بذارید که مشکل ساز نشه

تست رازی ارری لیست این میاد داخل ادد میکنه دانشجو رو و ایتم های دگیه رو اصلا به هیچ عنوان نمیپذیره به هیچ عنوان آیتم دیگه ای رو ازت نمیپذیره فقط استودنت رو ازت میپذیره

خب پس این تا اینجا شد یه ارری لیستی که خیلی دیگه هم عمومیه و هم محدود شده است یعنی هر دو تا رو داره ورودیش کنترل شده است خروجیش هم کنترل شده است و نوعش هم همه چی میتونه داخل قرار بگیره این شد جنریک هامون برای رازی ارری لیستمون بعدش اومدیم برای رازی سورت گفتیم رازی سورت باید چطوری باشه باید از نوع تی باشه

همه رو به نوع تی تبدیل کردیم به این صورت

خب چرا این کار رو انجام دادیم ؟چون که اگه برگردیم از جلسه اول یه مرور کنیم در مورد سورت جلسه اولی که اومدیم سورت رو بررسی کردیم اولش اومدیم مثلا برای سیرکل اومدیم این کار رو انجام دادیم گفتیم ما یه سورت مینویسم که فقط دایره ها رو مرتب میکنه این گام اول و گفتیم این وابسته است و این خوب نیست اومدیم یه مرحله بهترش کردیم گفتیم یه سوپر کلاس تعریف میکنیم به

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

یا اینکه میگم ن لیوان با مثلا بشقاب مقایسه میشه یا انسان با ماشین مقایسه میشه

از یه حالت دیگه هم دارم اختصاصیش میکنم میگم لیوان ها فقط وفقط با لیوان ها خود دارم میگم اما خب این قابلیت رو هم دارم بگم این لیوانه با یه چیز دیگه چیزی که الان میخوایم درباره اش حرف بزنیم یا اینکه جلسه قبلی هم درموردش حرف زدیم اینه که هرکی با هرکی نباشه همه چی با همه چی اگه قراره چیزی با چیزی باشه خودم بگم اگر خودم نگم ابهام به وجود میاد چطوری ابهام به وجود میاد ؟ مثلا من اینجا استودنت دارم گفتم این کمپیربله از اون طرف هم سیرکل دارم اینم نمیگم .

بعدش میام اینجا اینم نمیگم یه همچین چیزی

اینم استودنته

حالا من لیسیتی از دایره ها و دانشجو ها رو با هم قاطی شون کردم میخام مرتبشون کنم همه رو با هم قاطی کردم حالا میخوام مرتبشون کنم خب فرض کنیم همشون استودنت اند یه دونه هم دایره افتادن توشون

اینطوری تا مشخص هم باشه

خب استوتدنت ها خیلی راحت با هم کست میشن و میتونم کستشون کنم و با هم مقایسه شون کنم و نتیجه انجام بشن و هیچ مشکلی ندارم اما به محض اینکه می خورن به سیرکله خب این مشکل داره برای من اینجاست که اتفاقات ناخوشایند میفته و این ارور میده و یا مثلا این ور فرض کن این همشون سیرکلن و یه دونه استودنت افتاده بینشون حالا میای مقایسه میکنی همه رو تبدیل میکنه میرسه به استودنته نمیتونه تبدیلش کنه

ارور بهم میده میرسه به استودنته ارور بهم میده خب حالا این رو من چیکارش کنم این ابهام رو چطوری حل کنم ابهام اینطوری حل میشه که من خودم بگم که چی با چی مقایسه بشه مثلا اگر من

بگم این قابل مقایسه است با استودنته ا

بعدش اینجا باید بیام و حتما

خب این رو میاد برای من استودنت میزنه اگر حالا نوع دیگه ای بزنم مثلا سیرکل بزنم از من قبول نمیکنه

میگه باید حتما استودنت باشه خب من اگر استودنت رو بزنم این ازم

قبول میکنه حالا اینجا میام این رو دیگه نمیتونم بیام تبدیلش کنم به دایره و این رو تبدیلش میکنم به استودنت و میگم اریا این با استودنت مقایهس بشه

حالا اینیه چیز بی معنی ای هستش ها ولی خب من اینجوری میخوام

کی میاد دایره رو با استودنت مقایسه کنه

همچین چیزی که نیست البته باز این مشکلاتی داره ها به این سادگی ها حل نمیشه کلیتش رو دارم میگم چون که دو طرفه است ممکنه استودنت با دایره مقایسه بشه یا برعکس

پس این هنوز جواب نمیده به ما ولی خب من کلیتش رو بهتونو دارم میگم خب

ولی از این ور مثلا برای استودنت هامون

دقیقا همینطور

میگم کامپیربل هم استودنت باشه بعد این باید بیاد از نوع

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

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

مثلا اگر دایره از نوع استودنت کامپیربل باشه این قبول نمیکنه ولی خب باید از این نوع کمپیربل باشه خب این شد نکته دوممون که اومدیم و این کار رو انجام دادیم لیست یوتیلیتی مون هم که خیلی واضح و روشن بود چیز خاصی نداشت فقط همین کمپریتورش که که اونم صحبت کردیم اما یه نکته داشت که اونم گتفم بعدا بهتون میگگم اینکه این ها رو چطوری بیام و جنریک کنم

بهتون میگم این ها رو

خب این ها چیز هایی بود که از جلسه قبل داشتیم مطلبی که میخوام الان بهتون بگم جدیده خیلی با دقت گوش کنید یه خورده شاید سنگین تر از مطالب قبلی باشه خیلی خیلی با دقت گوش کنید خیلی خیلی مهمه میگم یه کوچولو شاید سنگین تر از مطالب قبلی باشه اون چیه اون مطلب ؟اون چیزی که میخوایم درموردش حرف بزنیم ؟

برای مرتب سازی


این رو قبلا یاد گرفتیم دیگه اگه من از نوع استودنت این ها رو تعریفشون کنم چندن تا داده داخلش قرار بدم بدم به ایتم و رازی سورت این رو برای من سورتش میکنه و هیچ مشکلی هم یپش نمیاد چون گفته ارریلیسیتتی از کمپیربل ها رو میپذیرم درسته ؟

خب استودنتم هم مگه کمپیربل نیست ؟

خود استودنت هم کمپیربله پس ارایه ای از استودنت ها هم میشه ارایه ای از کمپیربل ها

مشکل کجا پیش میاد ؟مشکل زمانی یپش میاد که

ارایه رو بردارم و ارری لیستش کنم

اینم باید ارری لیستش کنیم

لنگت ها به سایز تبدیل میشن چون دیگه ارری لیست چیز نداره میشن سایز و بقیه هم باید از ارایه خارج بشن و لیست اکسسز میشن

همه این ها رو این مدلیش میکنیم حالا یه ارور بهمون میده خب دیگه باید هم ارور بده درسته ؟ارایه است اون ارری لیسته استودنت رو باید تبدیل کنم به ارری لیست

به این صورت

و اینم بنویسم نیو ارریلیست

اینم اینطوری ننویسمش بنویسسم ادد کنه خب . .اما حل نشد بازم

هنوزم داره ارور میده مگه همه چی الان درست نیست ؟ انگار همه چی حله من همه چی رو درست نوشتم گفتم ارری لیستی از کمپیربل ها اینم ورودییم که ارری لیسیتی از کمپیربل هاست . استیودنت کمپیربله از نوع استودنت

از این ور هم این تی رو اینجا دارم اینم گفتم رازی از نوع استودنته پس وقتی میاد داخل این استودنت میشه پس این هم میشه ارری لیستی از کمپیربل های استودنتی خب منم الان همین کار رو انجام دادم

این رازی

این استودنت هم همون کمپیربل از نوع استودنته دیگه پس چرا داره هنوز بهم ارور میده ؟

در واقع تشخصیش میده اما نمیتونه تبدیلش کنه به چی تبدیلش کنه به ارری لبیست کمپیربل از نوع استودنت نمیتونه تبدیلش کنه به ارری لیستی از نوع کمپیربل از نوع استودنتی نمیتونه این رو تبدیل کنه چر انمیتونه این رو تبدیلش کنه

بخاطر اینکه من هم از ااون ارری لیست خودمون استفاده میکنم برای توضیح دادنش اون ساده تره حالا بریم داخل این یه خورده داستانش زیااد تره

این ارری لیست خودمون خب چطوری تعریفش کردیم ؟اومدیم این بالا نوشتیم پابلیک کلاس از نوع تی

مهم مهم مهم مهم

خیلی با دقت گوش کنید . این واقعا خیلی مهمه

رازی ارری لیست از نوع تی رو من اینجا نوشتم داخل جاوا و حالا این جنریک هایی که توش استفاده میشه وقتی شما مینویسید رازی ارری لیست از نوع تی

بعد یه دونه تی میاد اینجا قرار میگیره مثلا استودنت قرار میگیره مثلا فرض کن همین الان رازی ارری لیسته

رازی ارری لیست از نوع استودنت و استودنت اومده داخل

استودنت اینجا قرار میگیره انگار شما همچین کلاسی رو تتعریف کردین

این اتفاق نمیفته ها میگم انگار اینطوریه

بعد کلاس میسازه ازش براتون انگاری اینطروی میشه در این متد ادش مثلا میاد میشه استودنت


اینطوری انیشکلی انگار میشه یه کلاس برات تعریف میکنه و بقیه جززیاتش اون پایین داره اتفاق میفته بعد خب من

خب نوشتم ارری لیست از نوع استودنت ها خب پس این شد اولی

ارری لیست از نوع استودنت ها شد این

و شد این اما میام توی رازی سورت

توی رازی سورت نوشته چی ؟ گفته پرایویت ارری لیست کمپیربل از نوع تی تی هم که من فرستادم داخل از نوع استودنته پس اتفاقی که میفته انگار یه همچین چیزی میشه یعنی یکی دیگه از همین انگار تولید میشه

اینش کمپیربله و استودنت هم میره تو دایموندش یه کلاس اینطوری تعریف میشه

اینم بیارم بزارم این قسمت

انگار دقیقا همچین کلاسی تعریف میشه

توی تابع مینمون شد دومی :

توی رازی سورتمون

این تعریف شده اولی خب حالا پس داخل رازی سورت من دارم از این کلاس متغیر تعریف میکنم اما توی مین

دارم از این یکی کلاس میفرستم تو خب این پایینی رو نمیتونه تبدیل کنه به بالایی در چه صورتتی میتونست برام تبدیل کنه ؟در صورتی که من میومدم این دومی رو اینطوری مینوشتم :

یعنی اگر این اتفاق میفتاد میگتم رازی ارری لیست از نوع استتودنت اکستند اکستندی باشه ازرازی ارری لیست از نوع کمپیربل استودنت اگر این رو اکستند میکردم میتونست این رو بیاد برای من تبدیل کنه به این یکی و بزاره داخل این لیستم و مشکلم حل شه پس مشکل بخاطر نوع تعریف کلاس هامونه که توی جنریک ها اتفاق میفته من نیومدم بگم که رازی ارری لیست از نوع استودنت زیر مجموعه رازی ارری لیست از نوع کمپیربل استودنته من گفتم خود استودنت اکستندی از نوع کمپیربل استودنته خب خودش چه ربطی به این رازی ارری لیستم داره ؟؟

اما توی ارایه ها اینطوری نبود توی ارایه ها خب کلاسی تعریف نمیشد توی اارایه ها من از اون ور استودنتی به صورت ارایه داشتم و از اون ور هم کمپیربل داشتم و اگر استودنت ها همشون کمپیربل بودن میتونست اونا رو بندازه داخل برام کلاس جدیدی تعریف نمیشد همون داده بود فقط ارایه بود میفرستاد داخل امااما تو جنریک ها انگار واقعا یه کلاس جدیدی تولید میشه


با این اسم طولانیش و این رو من گذاشتم توی گذرگاهم الان من توی این گذرگاهم

این رو گذاشتم

بعد سعی دارم این رو بفرستم داخل ولی چون این زیر مجموعه اش نیست اصلا نمیپذیره ازم و بهم ارور میده حالا برای حلش باید چیکار کنم

کاری که باید انجام بدیم اینه که یه همچین کاری باید انجام بدیم :

این رو جنریکش کنم به همین شکلی که هست اما

این رو اینطوری ننویسم و تبدیل به تی اش کن م

این رو هم تی بزنم الان میگم چرا باید این کار رو انجام بدی م

این رو هم تی بزنیم :

و مشکل حل میشه ارورش حل میشه چراحل شد ؟دلیلش این چیزیه که بهتون میگم

من گفتم رازی سورت از نوع استودنت اتفاقی که میفته اینه

استودنت رو میاد میذاره اینجا

همه این ها رو استودنت میذاره

پس وقتی که من این استودنت رو اینجا گذاشتم

رازی سورت میاد و همه این ها رو استودنت میکنه

خب من گفتم چی رو بفرست تو ؟

ارری لیستی از استودنت ها رو

این چیه ؟ ارری لیستی از استودنت ها

و به همین سادگی حل شد



genericjava
دانشجوی کارشناسی کامپیوتر
شاید از این پست‌ها خوشتان بیاید