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