جلسه دوازدهم >>ادامه مبحث اینترفیس ها

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