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

جلسه ششم آموزش جاوا >>شروع ای او سی 2

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

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

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

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

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

خب الان داخل تیبل هام از این ارری لیست استفاده میکنم

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

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

کپشن و آی دی هم براش میزنم .

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

یه متد ادد راو که ستر اضافه میکنه رو هم تشکیل میدهیم .

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

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

این شد تیبلم به همین سادگی .

برای ستر هم میتونم ارری لیست بزنم اما میتوتنم اری لیست هم نزنم مثللا بخوام جدولم تتعداد ستون هاش یکی باشه اینطوری نباشه 5 تا سلول باشه یکش دو تا باشه یکیش 3 تا باشه

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

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

دیگه میام شرط میذارم که این idx هه کوچیک تر از سایزه اگر ن بیاد ارور بده در غیر این صورت باید بیاد داخل سلول ها idx برابر بشه با این سلول که در عکس پایین نگاه میکنید . :

شرطش رو هم میتونید بیاید بزارید که اگر idx کوچیک تر از سایز بود قبول کن در غیر این صورت ارور بده

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

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

و چیز های دیگه هم مثلا ای دی و اینا هم میتونیم اضافه کنیم که دیگه خودتون اضافه کنید .

خب میریم داخل کلاس سلول :

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

و سازنده اش رو هم میایم و تعریف میکنیم .

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

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

این قسمت که ادد کردم میام شرط براش میذارم میگم

برای ار هم یه چیز بزارم که تعداد سلول هام رو بهم بده

در داخل تیبلم این قسمت که ادد میکنم شرط براش میذارم اگر اار سایز برابر است با کالن سایزه اضافه اش کن . . چون میخوایم همشون یکی باشه در غیر این صورت

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

میخوایم درمورد ای او سی سطح دو صحبت کنیم از الان :

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

ما یکش رو یاد گرفتیم گفتیم :وابستگی نمونه ای از نوع داده رو حذف میکنیم و وابسته اش میکنیم به متغیر آدرس حافظه وقتی این کار رو میکنیم وقتی این کار رو انجام دادیم چشد؟

باعث شد من یه گذر گاهی برای سیرکل ارری لیستم تعریف کنم

یه گذر گاهی مث خط 17

این گذرگاهه عمومی تر از حالت قبلی بود .

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

این چیزی بود که قبلا انجام دادیم فهمیدیم که گذرگاهی عمومی تر از حالت قبلیه .. اما الان میخوایم چیکار کنیم ؟

میخوایم این گذرگاه رو عمومی ترش کنیم.

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

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

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

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

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

کجاش اشتباهه؟!

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

ولی توی ابجکت هام این رو رعایت نکردم و هر کدام رو دارم جدا جدا تعریفشان میکنم اگر من میتونستم این ها رو یه خورده عمومی تر تعریف کنم یه کار خیلی اساسی تر میتونستم انجام دهم تو تعریف هام این مشکلات هم حل میشد. ما قبللا برای تعریف ابجکت هامون یه رابطه تعریف کردیم به اسم has a

گفتیم ابجکت هامون فلان ویژگی ها رو دارن این رو داره اون یکی رو داره و .. اما یه چیزی رو یادمان رفته بگیم یه چیز خیلی مهم ما توی دنیای واقعیمون در تعریف آبجکت هامون همه چیز رو با has a تعریف نمیکنیم . یه سری چیزا رو با یه رابطه دیگه به اسم is a تعریف میکنیم . یعنی چ is a ? یعنی هست . مثلا من از شما میپرسم تلوزیون چیه شما نمیای ریز تمام جزییاتی که در تلوزیون وجود داره رو برا من به صورت has a برا من بگی خیلی ساده میای میگی تلوزیون یه وسیله الکترونیکی است و دارد یه سری ویژگی های خاص خودش پس دو تا رابطه اینجا هست یکی is a یکی هم has a اگه من بتونم رابطه is a رو تو کلاس هام رعایت کنم میتونم یه کلاس عمومی تر تعریف کنم مثل مثلا آبجکت های الکترونیکی و کلی ابجکت مختللف زیرمجموعه اش قرار بدم وبعدش بیام ولیو رو بر اساس آبجکت های عمومی تر تعریف کنم که بتونه همه اون ابجکت های زیر مجموعه اش روبپذیره یعنی چی مثلا برای سیرکلی که اینجا تعریف کردیم در واقعا کالر کردینت جز ویژگی های سیرکل نیست به طور مستقیم جز ویژگی های یه کلاس دیگه ان به اسم شیپ من این رو رعایت نکردم . توی همه کلاس ها وفیلم های آموزشی که در مورد یه چیزی به اسم ارث بری دارن صحبت میکنن فقط میان میگن که اره ما یه کلاسی تعریف مکنیم به عنوان مثلا سوپر کلاس ما و بقیه زش ارث میبرن اما به چ دردی میخوره رو نمیگن ما قرار است بفهمیم واقعا به چه دردی میخوره

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

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

این هم تصویری از کلاس شیپ ام . تو استرینگ هم براش میذاریم

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

بریم سراغ کلاس دایره و میخوام بهش بگم دایره is a شیپ یعنی میخوام سلسله مراتب براش تعریف کنم که تعریفام درست باشن چطوری بگم دایره ایز ای شیپ

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

و has a شعاع به همین سادگی . بعد از این طرف تو استرینگش رو اگه بزنم از طریق سوپر داتت تو استرینگ به شیپ هم دسترسی داشته باشم . به این صورت :

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

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

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

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

بجاش میام و اسمش رو عوض میکنم و مینویسم Shaparrylist و بعد متغیر سیرکل را نیز به Shap با استفاده از دستور کنترل r تغییر دادیم همچنینین نام آن یعنی circle را نیز به shap تغییر دادیم با استفاده از همین دستور .

خب این کار چه ویژگی خاصی برایمان داشت ؟

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

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

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

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

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

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

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

فعلا چیزی که مهمه اینه که من داخل متغیر آدرس حافظه شیپ میتونم یه نمونه از شیپ بریزم ، یه نمونه از سیرکل بریزم و یه نمونه ار رگتنگل و یا هر شکل دیگه ای که زیر مجموعه شیپه خب این یعنی چی یعنی الان شیپ ارری لیست من هم میتونم سیرکل به عنوان ایتم بهش اضافه کنم داخل یه آرایه ها ا قبلا همچین چیزی نداشتیم ... داخل یه ارایه من می تونم هم سیرکل بریزم و هم رگتنگل بریزم مثلا میگم شکل اولم

اینه و شکل دوم ام هم اینه (خط های 27_28) و وقتی پرینتش هم کنم پرنت هاشون رو هم کامل انجام میده یا هر شکل دیگه ای خب این یعنی این الان من گذرگاه رو یک مرحله عمومی ترش کردم به عبارت دیگه ioc سطح یکمان شد چی ؟

حذف وابستگی به نمونه ای از یک کلاس و وابسته کردنش به متغیر اادرس حافظه

حالا ioc2 حذف وابستگی به یک نوع داده و وابسته کردنش به یه نوع داده عمومی تر

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

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

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

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

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

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

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

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

حذف وابستگی به نوع داده خاص و وابسته کردن کلاس به نوع داده ای عمومی تر

پایان جلسه دوازده هم ioc2

شروع جلسه سیزدهم ادامه ioc2

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

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

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

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

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

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

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

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

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

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

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

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

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

مثل خط 24 میتونم کستش کنم به سیرکل الان این کد ارور میده یا ارور نمی ده این کدی که الان نوشتم ارور میده یا ن ؟ !

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

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

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

میشه مثل عکس بالا 19 رو در اینت قرار بدم و بعدش رشته در داخلش قرار بدم ؟! ( این در پاسخ به یکی از دانش اموزان بود ) ن خب ارور بهم میده اینم همین طوره مستطیل و دایره موازی هم دیگگه اند زیر مجموعه همدیگه نیستند من نمینتنونم مستطیل رو بریزم تو دایره یا بر عکس (شعاعش رو چطوری بریزم داخل w یا h !؟) نمیره اما شیپ رو میتونم

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

بخاطر اینکه

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

که ار رو بهم نشان بده یا اینکه مثلا من شاید نخوام داخل یه متغیر بنویسمش میتونم داخل متغیرم ننویسمش میام اینجا همه رو بذارم داخل پرانتز و بگم ست ار به صورت عکسی که در پایین میبنید :

که این الان برای من کار میکننه میگم سیرکل کست کن اس یک رو و بعد ار یا همون شعاع رو مقدار دهی میکنیم و دایره رو به ما نشان میده و این چیزی که من نوشتم کستش میکنه و بعدش میگم مثلا r اش برابر 12 ولی داخل s1 فقط میتونم به کالر و کردینت دسترسی داشته باشم از لحاظ ست

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

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

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

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

حالا چند تا نکته داشتیم

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

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

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

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

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

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

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

برنامه هامون دو تا حافظه داره این رو دقت کنید وقتی یه فایل اگزه ای رو دابل کلیک میکنین داخل ویندوزدو تا اتفاق میفته یکی اینکه همه کدی که برنامه تو داره مدل هایی که نوشتین تابع مینی که داره همه چیز هایی که به صورت کد نوشتینش و متغیر های اولیه ای که دارید مثل اینت و دابل و .. . . . ( اینهایی که توی خود مین هستند )همه این ها داخل حافظه استایتک براشون حافظه در نظر گرفته میشه یعنی به محض اینکه دابل کلیک کردین حافظه شو برات میزنه میگه اینقدر حافظه برای کدت اینقدر حافظه برای متغیرهای استاتیکش یا همون متیغر های اولیه اش و اون میشه حافظه استاتیکمون حالا یه سری چیزای دیگه هم دارم اما به محض اینکه برنامه من میاد میرسه به همچین کدی

متغیر های ادرس حافظه هم داخل حافظه استاتیک هستند وقتی میرسه به نیو سیرکل کاری که انجام میده چیه ؟

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

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

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

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

اینجا دیگه نوشتم دیگه

الان یه سری سیرکل داخل حلقه ریختم

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

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

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

به این دلیل داخل سیرکل میگم دیس

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

حافظه هیپ را در نظر بگیرین c1 داخلشه و استیت ها رو فقط ذخیره کرده یعنی چی یعنی r ، ای دی بعد داخل کالر مثلا ار جی بی و داخل کوردینیت ایکس وای زد ، همه رو برای من میذاره . و بعد ادرسش رو میذاره داخل c1 اما بقیه کد رو دست نمیزنه بقیه کدت تو همون استاتیک قرار میگیره بجاش یک کار دیگه انجام میده میاد یه متغیر استاتیک دیگه تو خودش تعریف میکنه به اسم دیس

شیپ این دیسه رو داره دیگه که تو همون حافظه استایتکه قرار داره وقتی که من میام از طریق c1 میگم سی یک نقطه ست ار

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

پس متد ست ار ما

این به این معنیه هم اون متیغر ادرس حافظه فعالی در حال حاضر داره با سیرکل ها کار میکنه مثلا c1 هه ؟ خب میشه c1

اگه c2 باشه خیلی پیچیده اش نکنیم جزییات حافظه و اینجور چیزاشو خیلی ساده تر بهتون بگم . اگه با c1 ست ار رو صدا بزنیم

این دیس برابر سی یک هستش

اگه با c2 صداش بزنم

این دیس برابر با c2 هستش اگه با هر دایره دیگه ای با هر نمونه دیگه ای صداش بزنم این دیس برابر با اون نمونه داده میشه

پس وقتی میگن دیس دات ار یعنی اون متیغر ادرس حافظه که به یه قسمتی از ارایه داینامیک داره اشاره میکنه فیلد r اش رو برابر با فلان قرار بده . . .

این از دیس حالا سوپر چیه سوپرم دقیقا همینه اما مث کد 26 کار میکنه

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

اما s فقط سیت کوردینیت و کالر رو میبینه :

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

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

و اگه با پرانتز صداش بزنم سازنده اش صدا زده میشه

مثلا اینجا من گفتم دیس یک و نه

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

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

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

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

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

مثلا این دوتا c1 و c2 استیت هاشون با هم فرق دارن مثلا اولی یک و هفته دومی یه 22 و 9 هستش یعنی مقادیری داخلش قرار میگیره که باعث تفاوت با بقیه نمونه ها میشه

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

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

خود جاوا یه دونه داره مثلا کلاس math که میاد برام لگاریتم حساب میکنه

3 تا ازش تعریف کردم مثلا فرض کنید میشه حالا این نمیذاره بعد من میام و میگم لگاریتم 19 رو با ام یک حساب کن :

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

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

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

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

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

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

حالا من یه سوال از شما دارم

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

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

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

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

چرا متغیر ایکس که در عکس پایین نوشتیم در حافظه استایتک من ذخیره میشه ؟

چون مینم استایتکه به همین سادگی اصلا خود کلمه استاتیک برای همینه چون مینم استایتکه هر متغیر داده اولیه ای که توش تعریف کنم استاتیک تعریف میشه و در عکس پایین ایکس رو که تعریف کردم به صورت استایتک تعریف کنم ایکس هم در حافظه استاتیک ذخیره میشه :

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

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

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


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

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


بعدش بگم اصن نیازی نیست ازش نمونه بسازی وقتی که استاتیکش میکنم توی حافظه استاتیکم ذخیره میشه وقتی تو حافظه استاتیکم ذخیره بشه میتونم اینطوری صداش بزنم

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

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

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

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

خب

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

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

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

یه نکته دیگه هم میمانه و اونم اینه که :

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

این متد داخل شیپ هستش داخل سیرکل هم هستش وقتی که من میام داخل شیپم مینویسم s1=c1 بعد میگم اس یک نقطه area بعدش میام مینویسم سیرکل اس یک نقطه area و یهدونه هم مینویسم سی یک نقطه area

به این صورت در عکس :

کدامش کدام رو داره صدا میزنه ؟کلشون سیرکل رو دارن صدا میزنن

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

حالا چرا این اتفاق میفته ؟ اصطلاحا این اتفاق داره میفته

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

این الان داره شیپ رو صدا میزنه اما به محض اینکه این کد نوشته میشه خط25

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

میاد و این رو خط میزنه و اون رو رونویسی میکنه روش یا واژه تخصصیش اوور راید میشه رونویسی میشه و وقتی رو نویسی میشه دیگه فرقی نداره تو با کدوم متغیر ادرس حافظه داری صداش میزنی اگر این کد نوشته بشه :خط25


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

اجراش میکنیم

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

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

الان این شیپه و شیپ رو داره صدا میزنه

اومد تو کلاس شیپ پس کاملا درسته میگه صفر حالا رونویسی انجام میشه s1=c1 الان رونویسی شد و من میام میرم داخلش دوباره اومد کجا ؟اومد کلاس سیرکل همه رو دارم با اس صدا میزنم ها همشون اس هستند

اومدم داخل سیرکل میگه 3.14 *r*r

28 هم تموم رونویسی میکنم یه ایتم جدیدی رو

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




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