جلسه چهارم شی گرایی ;ادامه پروژه

نکته :هدف این است که شی گرایی در جاوا بر اساس یک پروژه پیش گرفته شود .. به همین خاطر شما برای فهم این جلسه باید جلسه های قبل رو هم مطالعه کرده باشید . مثل یک سریال .ای او سی یک :خلاصه اش در جلسه قبل شد : حذف وابستگی به نمونه و ایجاد وابستگی به متغیر آدرس حافظه.دو تا کار میتانم انجام بدم . یکی اینکه زیرشان sout بنویسیم . یا اینکه زیرش یک تابع بنویسیم و داخل پرانتزش مینویسیم : (student s ) .می آیم یه sout می نویسیم و تمام فیلد هایش رو چاپ میکنم .خب الان ما یه تابع printstudent نوشتیم که می آید و تمام فیلد ها رو یکی یکی چاپشان میکنه .در هر student ای که داشته باشم مثل خط 17 و 18 چاپشان میکنه .یه راه اش هم این بود که برای هر کدام از استودنت ها sout می نوشتم . اما دیگه شلوغ میشد . و این بهتره.الان ما یه مشکل هنوز داریم :اگه ما اینجا هر تغییری ایجاد کنیم مثلا یه ایکس اضافه کردیم .و ستر و گتر را هم الان اضافه میکنیم .و در عکس بالا هم نشان می دهد که باید در تابع پرینت استودنت ایکس رو بنویسیم و در بالا هم برای هر استودنت ایکس را در فیلدش جاگذاری کنیم .اگه دوباره بخوایم چیزی را حذف کنیم باید تمام این تغییرات را انجام بدهیم .خب اون داستانی که ما صحبتش را کردیم داریم انگاری نقضش میکنیم . و خوشایند نیست .پس بجاش یه کار فوق العاده ای انجام میدیم . یه کد خیلی خیلی عمومی رو ما میخواهیم این مدل کد های عمومی رو بنویسیم واون پرینت لاینه .ما میتونیم بجای همه داستان های داخل پرینت استودنت که نوشیتم فقط بنویسیم . println(s) همان طور که در عکس هم مشاهده میکنید .اما این فعلا برای من کار نمیکنه یه سری تغییرات باید ایجاد کنم که برای من بیاد و کار کنه . نکته مهمش اینه که پرینت لاین همه چی میگیره هرچی بهش بدیم میگیره و چاپ میکنه . اگه همینطوری استودنت رو بهش بدیم اون آدرسش رو برایمان چاپ میکنهعکس بعدی رو نگاه کنید .میگه که اگه اینو تو کلاس خودت داشتی من این چیزی که تو کلاست هست رو برات چاپ میکنم .که به آن دستور تو استرینگ میگن.اگر دیت رو که در عکس پایین می بینین همون طوری بنویسین میاد و فقط آدرسش رو باز هم براتون چاپ میکنه .اما ما میریم تو کلاسش و در کلاسش از دستور تو استرینگ استفاده میکنیم به این صورت :و میاد این فرمت رو برامون جاگذاری میکنهالان یه بار اجراش بکنیم و ببینیم چطوریست . و دیگه آدرس چاپ نمیکنه و میاد و استویدنت رو چاپ میکنه .همون طور که در کامپایل میبیند جزییات دانشجو ها رو برامان چاپ کرده است .اما پرینت لاین چطوری میاد و اینا رو تشخیص میده و چرا اگه من تو استرینگ را نذارم میاد آدرس چاپ میکنه ؟ !آبجکت رو یادتان هست ؟ که درموردش گفتم که هرچیزی در جاوا از آبجکت میاد .اگه به این صورت فقط یه o بذاریم و تو خودش یه سری متد داره داخل خودش .و اینکه اونایی که یکم سفید تر هستش بخاطر متد هایی هستش که خودمان ساخته ایم . ال باقی در آبجکت هستن .و آبجکت در خودش متد تو استرینگ هم داره و کارش اینه که نوع و اسم رو برامون چاپ کنه . آبجکت رو که باز کنیم داخلش یه سری کد هست که یکیشون تو استرینگ هستش . به این صورت :اگه ما "تو استرینگ" استفاده نکنیم به صورت پیشرفض خودش از تو استرینگ آبجکت استفاده میکنه و نوع و آدرس رو چاپ میکنه اما اگه ما از تو استرینگ استفاده کنیم از تواسترینگ ما استفاده میکنه .خب الان میخواهم آرایه ای از استودنت ها تعریف کنم .در خط دهم متغیر stsize را تعریف کرده و ده را درون آن جا گذاری کردیم . و سپس random را برای عدد تصادفی استفاده کردیم و سپس آرایه ای از استودنت ها نوشتیم که مقدارش برابر با همان مقدار stsize ای است که در بالا گفته شده .و بعد از تعریف آرایه استودنت نمونه های آن را با استفاده از حلقه ایجاد میکنیم . حلقه ای می زنیم که از 0 حرکت کند و تا کمتر از stsize ادامه پیدا کند و یکی یکی اضافه شود . و بعد در درون حلقه stsize را برابر نمونه ای از یک دانشجو کرده ایم .و بعد فیلد های نمونه را طوری درست کردیم که به صورت شانسی دانشجو های متفاوت را ایجاد کند و آن هم با اضافه کردن i به شماره ها و همچنین استفاده از دستور random برای تاریخ تولد .و سپس در خط 26 تابع پرینت استودنتز را دستکاری میکنیم و به printstudents تغییر نام میدهیم و برای چاپ دانشجو ها از حلقه استفاده میکنیم .الان اگر من بخوام ایکسی که تعریف کردم رو حذف کنم فقط وفقط در استودنت در قسمت های ستر و گتر و در قسمت تو استرینگ و تعریف متغیر آن را حذف میکنم و نیازی نیست در قسمت های دیگه یا در کلاس های دیگه کاری کنم .یعنی نیازی نیست هیچ خط کدی در "مین" تغییر کنه.کد چاپ کردن استودنت ها در خط 25 را میخواهیم بهتر کنیم و آن هم به وسیله "استودنت کانتینر" یا همان نگهدارنده استودنت ها . و بعد در آن استودنت کانتیرهه بیام یه سی کد بنویسم که پرینت کنه ،مینیمم بگیره ماکزیمم بگیره ، مرتبشون کنه و . . .پس ما کلاسی به همین اسم ایجاد میکنیم .در گام اول ستر و گتر رو میگذاریم و بعد برایش کانستراکتور میگذاریم .حالا میخواهیم چند تا کار رو انجام دهیم از قبیل سورت کردن و ماکزیمم و مینیمم و .. گرفتنخب الان میایمالان ممکنه بگید از ورودی و خروجی های وابسته استفاده کردم اما اشکالی نداره چون هدف این تابع همین هست تو کلاس استودنت نباید هممچین کاری کنم .و در نهایت چیز هایی که در کلاس استودنت کانتینر تعریف کردیم رو در تابع مین چاپ میکنیم .