جلسه هفتم >>ioc2 ,override,hashmap, polymorphism

شروع فیلم جلسه دهم شی گرایی بنام اورراید و همچنین تایمر و هشمپخب حلقه ها رو که میدونید میان و یه کاری رو که بهشون میدیم پشت سر هم میتونن به اندازه تعداد بار هایی که خودمون بهش بگیم برامون انجام بدن و اونم با نهایت سرعتش میاد و این کار رو برامونن انجام میده .یه زمانی شما نمیخوای بر اساس تعداد این کار رو انجام بدی میخوای بر اساس زمان انجام بدی یعنی یه چیزی رو بر اساس زمان تکرار کنی . مثلا بگی هر یک ثانیه یک بار برام تکرار کن هر یه ساعت یک بار برام تکرار کن . تو این شرایط دیگه نمنیتونی از حلقه استفاده کنی چون اگه از حلقه استفاده کنیم . مثلا اگه بخوایم از حلقه ها برای اینکار استفاده کنیم میتونیم حلقه های بیکاری رو توش بندازیم ( مشکل ویدیو ) برنامه تو اون حلقه گیر میفته و هیچ وقت نمی تونه بقیه کار هاتو انجام بده اما من میخوام این اتفاق نیفته میخوام ستش کنم 15 ثانیه یک بار انجام بشه 15 ثانیه که گذشت انجامش بده دیگه کارش نداشته باشه تموم شد بره کار های دیگه انجام بده و بعد از 15 ثانیه دوباره برگرده انجامش بده دوباره بره ادامه کار هاش و و دوباره بعد از 15 ثانیه برگرده و انجامش بدهبرای اینکه این کار رو انجام بدیم اصل کار اینه که از ترد استفاده کنیم . ترد یا نخ بهش گفته میشه ترد در واقع پردازش موازی انجام میده حالا بسته به اینکه کامپیوترتون پردازش موازی داره واقعا موازی میشه یا اینکه تایم شیر موازیش میکنه یعنی مثلا یه مدت زمانی این ترد رو انجام میده یه مدت زمانی ترد بعدی رو انجام میده الان چطوری کامپیوتر من ادوبی کانکت رو داره مدیریت میکنه هم اینتلی جی رو داره مدیریت میکنه این داره صدا براتون میفرسته ویدیو براتون میفرسته منم دارم با این کار میکنم .اینا توی پردازش های جدا دارن اجرا میشن . داخل هر پردازشش ترد های مختلفی هم وجود داره مثلا من الان بزنم و اینو اجرا کنم کامپایلش میکنهو همزمان که داره این رو کامپایل میکنه من میتونم کار های دیگه ای رو هم انجام بدم . یعنی این داره کامپایل میکنه و من میتونم مثلا تایپ کنم و کارم رو ادامه بدم . دلیل اینکه تو یه برنامه میتونم کار های مختلف انجام بدم اینکه داره از ترد های مختلف استفاده میکنه . یا مثلا این چیزی که برای شما داره ااتفاق میفته . هم داره ویدیو براتون میفرسته هم داره صدای من رو میفرسته و همزمان الان حرف میزنم ، ویدیو میفرسته و اینجا هم دارم تایپ میکنم من . . خب الان داره تو ترد های مختلفی انجام میشه که این داره تایپ رو انجام میده و از طرف دیگه داره ارسال میکنه . فعلا ما کاری به ترد نداریم . فقط خواستم بیس کار رو بهتون بگم . من برای این کاری که بهتون گفتم رو انجام بدم . از یه چیز خیلی ساده و آماده استفاده میکنم . نمیخوام خودم درگیر ترد بشم . از یه چیز آماده استفاده میکنم که بهش میگیم تایمر که داخل خود جاوا هستش توی این تایمره ترد وجود داره دیگه ما کاری نداریم که چطوری داره انجامش میده خب ما فقط ازش استفاده می کنیم . یه نرم افزار اماده است در جاوا داخل تایمر داره از ترد و این جور چیزا استفاده میکنه که پردازش موازی امکان پذیر باشه ولی ما دیگه کاری نداریم که چطوری این کار رو میکنه فقط ازش استفاده میکنیم . یه نمونه از تایمر رو میسازیم به این صورت :بعد از اینکه ازش نمونه ساختم . این تایمره یه متد داره به اسم اسکیژول که این اسکیژول پارامتر های مختلفی میگیره که این سومیش برای من خیلی مهمه یکیش نوشته تایمر تسک یکی هم دیلی و دیگری هم چرخه زمانیش یعنی توی چه بازه های زمانی بیاد برای ما انجام بده بر اساس میلی ثانیه است . دومین پارامتر داره میگه اولین حرکتم رو با چه تاخیری انجام بدم . برای اولین حرکتم که میخوام انجام بدم تاخیری داشته باشم یا ن . اما از بین این ها این تایمر تسکه خیلی مهمه تایمر تسک یه خورده سینتکسش فرق داره با چیز هایی که تا الان نوشتیم . من باید بیام و قبللش تایمر تسک رو تعریف کنم . تایمر تسک اون وظیفه و کاری هستش که میخوام این تایمره برای من انجامش بده مثلا میگم اینجا هیچ دیلی ای نداشته باش و هر هزار میلی ثانیه بیا و این کار ها رو برای من انجام بدهبر اساس میلی ثانیه است یعنی من ااگه هزار میلی ثاینه بزنم میشه یه ثانیه چه کاری برای من انجام بده میخوام یه کاری برای من انجام بده .. . مثلا میگم توی صفحه نمایش برای من چاپپ کن سلام . هر یه ثانیه یک بار بیا و برام بگو سلام. خب چطوری این کار رو انجام بده باید بیام و تایمر تسک رو تعریفش کنم . مینویسمش اما نمونه سازیش یه خورده فرق دارهنیو رو میزنم اولین چیزی که خودش اورده روش اینتر میزنم .یه همچین کدی رو برای من تعریف میکنه که یه سمیکالن رو هم در اخرش باید بذارم . کار اینکه این الان چطور کدی هستش نداشته باشید . جلو تر که بریم بهش میرسیم چیه . . نمونه ای که ساختیم بهش میگن کلاس ناشناس که بعدا درباره اش حرف میزنیم . فعلا نمیخواد درگیرش بشید . بعد از اینکه تعریفش کردین تو قسمت ران کاری که قراره انجام بشه رو مینویسی مثلا من سلام رو چاپ میکنم .و این رو میدم به تایمر به این صورت که میگم این تسک رو به صورت 2 ثانیه یک بار اجرا کن . حالا اجراش میکنم ببینم چطوری اجراش میکنه . دیلی برای اولین بار اجرا شدنشه اینم کامپایل برنامه که بعد از دو ثانیه یک سلام دیگر چاپ میکنه . تا بی نهایت این روچاپ میکنه برام . یعنی صد سال دیگه هم این کامپیوتر رو روشن کنی برات این رو چاپ میکنه .خب میام یه سری کلاس تعریف میکنم اولین کلاس به اسم ویژوال کلاس یا ساعت مجازی درست میکنمو یه سری وظیفه لازم دارم من . چون میخوام کار های مختلفی انجام بشه مثلا یکی ایمیل برام بفرسته دیگری مرتب کنه کار هام رو کار های مختلفم . . .پس منم بیام یه وظیفه ای رو تعریف کنم مثلا چیزی به اسم تسک یه سری تسک دیگه . این تسک اصلیم هستش اول بیام این رو تعریف کنم یه تسک چی باید داشته باشه ؟ هر تسکی چی باید داشته باشه من میخوام وظیفه هام . اینطوری باشن که مثلا یه زمان براشون مشخص کنی یه کار براشون مشخص کنی رسید به اون زمان اجرا بشه دو تا فیلد خیلی اساسی دارم یکی اسمش رو میذارم تایم استمپ (اون برچسب زمانی که تو چه زمانی اجرا بشه )یه متد هم براش تعریف میکنم به اسم مثلا ران که کاری رو که میخوام انجام بشهپس تو این بازه زمانی کار رو برام انجام بده این یعنی یک وظیفه هر وظیفه یه برچسب زمانی داره و یه کاری که باید انجام بشه . و خب من الان میتونم بیام ستر و گتر هاش رو بزنم و بگم این ستر و گترش و یه سازنده م براش تعریف کنم که تایم استمپه رو مشخص کنهچون بیرون اومدم تعریف کردم که مثلا فرض کن فلان تسک رو بیا برای من انجام بده تایمش هم مشخص کن بگم مثلا لحظه بیستم بیا انجامش بده اینم از خود تسک اما خب اینم همیش همینه دیگه همیشه همین تسکه است من که نمیخوام همیشه همین تسکه باشه من میخوام تسک های مختلف باشه پس این رو به عنوان سوپر کلاس در نظر میگییرم و بعدش میام یه سری ساب تسک هم براش تعریف میکنم البته تا اینجاش رو در نظر بگیرید و بذارید ویرچوال کلاکش رو براتون بگم . بعدا ساب تسک هاش رو مشخص میکنیم. ویرچوال کلاک میخاد چیکار کنه ؟ ویرچوال کلاس باید تو یه زمان های از پیش تعیین شده تسک هایی که براش ریجستر شدن رو بیاد و اجرا کنه پس باید قابلیتی داشته باشه که وظیفه ها رو ریجستر کنه ده تا دو تا صد تا هزار تا باید تسک رو ریجستر کنه پس من اول میام یه متد در نظر میگیرم براش به اسم ریجستر خب ریجستر کن یه سری چیز رو برای من ریجستر کن اما چی رو ریجستر کن تسک ها رو برام ریجستر کناگه ففقط همین یه دونه تسک رو داشته باشم خب نمیتونم تسک های مختلف رو اجرا کنم .من میخوام تسک های متفاوتی داشته باشم که بتونم اون ها رو داخل سیستمم ریجستر کنم و ویرچوال کلاک رو انجام بده یکی ایمیل بده یکی مرتب کنه یکی میره سرویس سایت رو چک میکنه کلی کار های مختلف هستند که من میخوام فرق داشته باشن نمی خوام از همون اول بگم اینه وقتی میگم سیستم دات اوت سند ایمیل من که فقط ایمیل رو نمیخوام پس تسک رو به عنوان سوپر کلاس تعریف میکنم و بعدش میام و یه سری ساب کلاس براش در نظر میگیرم مثلا فرض کن سند ایمیل تسکتسک ارسال ایمیل یه دونه دیگه تعریف میکنم به اسم سورت فایل تسک تسک سورت کردن فایل ها و تسک سند ایمیل این دو تا کلاس باید اکستند بشن دیگه باید ارث بری بشن دیگهبه این صورت و سازنده اش رو هم بزنم . و هر کدام ویژگی های خاص خودشون رو داشته باشن به این صورت مثلا سند ایمیل یه فیلدی هم داشته باشه که اسم کسی که میخوایم براش ایمیل بنویسیم رو داخلش بنویسیم خب هر کدام کار های بخصوصی رو انجام میدن پس اون متد ران رو باید اور راید کنیم به این صورت که برای هر دو شون اور راید رو همون طور که سازنده روایجاد میکنیم در داخل کلاس ها ایجاد میکنیم .و داخلش مینویسم مثلا سورت فایل . خب الان که نمیخوام فایل ها رو مرتب کنم . فقط میگم اینجا داره کار ها رو انجام میده همین رو میذارم برای سند ایمیل . .حالا در مورد اوور راید کامل حرف میزنیمحالا توی ویرچوالکلاک قسمت ریجستر میخوام تسک رو ریججستر کنم می نویسم تسکپس الان این قابلیت وجود داره بیام یه همچین کدی بنویسم : ویرچوال کلاک رو تعریف کنم و بعد بیام بگم ویرچوال کلاک دات ریجستر میگم یه دونه سند ایمیل تسک تعریف کن توی لحظه ده بفرستش به علی مثلا حالا فرض کنیم ادرس ایمیل دیگهیا مثلا میگم : یه چند تا اینطوری انجام بده توی لحظه های مختلفبعد از این ها یه دونه سورت هم مینویسماین ها الان ریجسترشون هستش و هنوز کاره انجام نمیشه فقط دارم میگم ویرچوال کلاس توی لحظه ده ات فلان کار رو انجام بده توی لحظه 20 ات فلان کار رو . . .. یعنی چند تای اول سند تو ایمیل بود و دو تای اخر مرتب سازی بود . من یه متدی لازم دارم بعد از اینکه این ریجستر ها رو انجام دادم بگه بهم ک کاره رو شروع کن بگه مثلا ویرچوال کلاک دات استارت اول ریجسترشون میکنم بعد میگم استارت خب استارت رو که بزنم خودش تو ویرچوال کلاک خودش تعریفش میکنه به این صورت که اگه روش alte و enter رو بزنم خودش تو ویرچوال کلاک تعریفش میکنهاما ریجسترم که کار نمیکنه هیچی توش نیست کجا ریجسرشون کنم ؟ من اونجا نوشتم ریجستر ولی واقعا که این کار رو نمیکنه ک خب الان میخوام همین رو بهتون بگم اریجستر کردن برای ثبت کردنش هستش ریجستر کردن برای ثبت کردنش هستش . مثلا من به شما میگم روز چهارشنبه امتحان دارید . خب این زمان بندی میکنم براتون شما ها روز چهارشنبه امتحان دارید . مثلا یه مدرس دیگه بهتون میگه روز شنبه امتحان ریاضی مهندسی دارید روز شنبه هفته آینده امتحان مهندسی نرم افزار دارید . خب این ها رو شما برا خودت ثبت میکنید تو برنامه تون مینویسید . این اولی این دومی و این سومی و وقتی میرسه به اون تاریخش انجامش میدی رسیدی سه شنبه امتحانت انجام میشه و بقیه روز ها هم امتحان هات انجام میشه . زمان بندی میکنی و .. . منم همین کار رو دارم انجام میدم . اومدم یه چیزی تعریف کردم به اسم ویرچوال کلاک حالا دارم به ویرچوال کلاک برنامه میدم میگم لحظه ده براش ثبت میکنم که بیا این کار رو انجام بده و بعد از اینکه ثبتش کردم میگم دیگه حالا زمانت رو شروع کن دیگه شروع میکنه برسه به این زمان ها شروع میکنه انجامش بده اما واقعا هنوز که کاری نمیکنه چون من متدم خالیه حالا میخوام اینا رو بنویسماین ها رو چطوری بیام ثبتشون کنم ؟چطوری بیام این تسک هایی که میان رو ثبت کنم ؟ برای اینکه این ها رو ثبت کنم اگه یادتون باشه ما قبلا ارری لیست رو یاد گرفتیم . هر کدام از این ها که میان داخل باید داخل لیستی ذخیره بشن و خودمون هم امدیم چیزی نوشتیم به اسم شیپ اری لیست و بهتون هم گفتم که خود جاوا ارری لیست داره که خودمون هم میتونیم ازش استفاده کنیم .و این طوری تعریفش میکردیم . و بعدش میگفتیم که استودنت ها بیا اد کن مثلا یه استیودنتیدوباره مثلا یه استودنت دیگه و دوباره تا اخر بعد چطوری بهش دسترسی داشتم ؟ این مدلش بهش دسترسی داشتم مثلا فرض کن بعد مینوشتم استودنت اس استودنت ها دات گت . گتش رو نگاه کن اندیسش چیه ؟صدرصد عدد صحیح هستشصدرصد لیست هایی که مثل ارری لیست ساخته میشن صدرصدشون اندیسشون عدد صحیح هستش میگم اونی که توی خونه ششم هستش رو بهم بده یا خانه های دیگهاما من میتونم از یه لیست های پیشرفته تری هم استفاده کن که یه خورده سرعت رو هزینه میکنن اما خب خیلی قابلیت های فوق العاده ای برام داره شما دیکشنری که صد در صد استفاده کردین مینویسین مثلا هللو یعنی چی ؟ بعد فارسیشو برات مینویسه سلام . اندیس بهش میدی ؟ ن نمیای بهش بگی اونی که توی خونه دهم ات هست چیه میگی هلو یعنی چی هلو عدد صحیح نیست هلو یه رشته است . یعنی در واقع اندیست بجای اینکه عدد صحیح باشه رشته است میگه هلو رو بهم بده داخل جاوا میتتونید این ها رو تعریف کنید از یه چیزی استفاده میکنین به اسم هش مپبعد دو تا مقدار ازتون میگیره قبلی فقط یه دونه استودنت میگیرفت ازتون ولی این دو تا ازتون میگیره میگه نوع اندیست چی باشه میگم استرینگ باشه میگه نوع دادها ت چی باشه میگم اونم استرینگ باشه بعد اسمش رو هم میذارم دیکشنری بعد میگم نیو هش مپ بعد چطوری بهش مقدار میدم میگم دیکشنری دات پوت ، دیگه نمیگم اددمیگم بیا قرار بده هلو رو با سلام .میگم یه چیزی دارم با اندیس هلو بعد مقدار سلام رو براش مقدار دهی میکنیم . و بعد چیز های دگیه مثلا بیا قرار بده چی بگم هرچیزی مثلا شیپ و شکلخب حالا میخوام بازیابی کنم میگم استرینگ اس دیکشنری گت کن هلو روهلو رو بهم بده هلو چیه میگه سلام .دقیقا مثل دیکشنری برات کار میکنه ولی قبلش باید خودت پرش کنی دیگه میگم هلو یعنی چی میگه سلام یا اونی که تو خونه شیپ هستش چیه میگه شیپ چطوری این کار رو انجام میده از هش کد استفاده میکنه هش کد چیه بعدا بهتون میگم نمیخوام فعلا درگیرش بشیم فعلا ازش استفاده میکنیم .اره دیگه یه متغیر تعریف کردم که هرچی که دوست داریم میشه اسمش گذاشت .حتما هم نباید رشته باشه مثلا میشه یکی رو استرینگ گگذاشت و دیگری رو استودنت گذاشت . هرچی که بخوایم میتونی جاش بذاری هر نوع داده ای میشه برای هر دو تاش بذاری میگم اسم ها رو بذارم مثلا علی و رضا به این صورت :و قسمتش دومش نمونه سازی استودنت میکنم یک و اسمش علی و و رضایی و معدلش هم 18 این طوری هم میتونم بهش مقدار بدم .حالا میام و بهش میگم استودنت علی رو بهم دهولی بر عکس بهمون نمیده اگه بخوای برعکس انجامش بدی باید برعکس تعریفش کنی یعنی مثلا بنویسی سلام و اون ور بنویسی هلو بر عکسش رو بهت نمیده این وری اندیسه اون وری مقداره همیشه این ور اندیس اون ور مقدار میگم رضا رو بهم بده این استودنت رو بهم میدهمیتونی برعکس هم بذاریش هایعنی مثلا اونی که ss هستش علی هستش در واقع بعد میگم اسس رو بهم بده رشته بهت میده و اسم دانشجو رو بهت میدههرمقداری بهش بدی مثلا الان اس اس رو بدم علی رو بهم میده که چیز مهم و پرکاربردی هستش الان من میخوام باهاش یه کار فوق العاده جالب انجام بدم . برای همین برنامه مون میخوام از هش کد استفاده کنم .چطوری ازش استفاده میکنم ؟ این تسک ها هستمیام اینجا یه هش تعریف میکنم پرایویت هش مپ از نوع اینتجر میذارم و از نوع تسک میذارمبرای اینتجر ها از یه نظر دیگه هم خیلی مفیده اینجا بود که من الان میتونم بیام مثلا هشم رو اینطوری تعریف کنمو اندیس هام رو نامرتب بزنم بگم تو خانه چهار علی رو بزار دیگه مثل اون ارری لیست نیست که بخوام از صفر یک دو سه چهار شروع کنه و ادامه بده نامنظمه مثلا میخام بگم توی اندیس ده ، علی رو توش بذارنمیاد تو خونه دهم ها همون اولیه اس ولی اندیسش دههبعد مثلا میام میگم توی اندیس 1000 مثلا رضا رو تعریف کناین خونه دومی اس ها ولی اندیسش هزار هستش به چه درد میخوره این ؟ برای دقیقا همین چیزی که اینجا نوشتم :میخوام توی لحظه دهم ارسال ایمیل به علی رو داشته باشم لحظه بیستم به رضا و . . . فرق دارن دیگه منظم نیستپس من الان هش مپ تعریف کردم و اینتجر و تسک و میگم مثلا تسک هش مپ و نیوش رو هم انجام میدمبعد از اینکه این کار رو انجام دادم دیگه میام اینجا و ریجستر رو انجام میدم . میگم تسک هشمپ دات پوت کنکجا قرار بده مگه تسک هام یه تایم استمپ نداشتن ؟ ! میگم توی لحظه تایم استمپ خود تسک رو قرار بدهاین الان شد ریجسترم اما استارتم چی چطوری بیام و زمان ها رو شبیه سازی کنم برای اینکه زمان هام رو شبیه سازی کنم از تایمر استفاده میکنماز تایمر استفاده میکنم و یه تایم تعریف میکنم و از تایمر تسک استفاده میکنم و نمونه تایمر تسک رو هم میسازم .و توی هر تیکش میخام بیاد و این تسکی که اینجا هست رو اجرا کنهبه جای اینکه این جا اینطوری بنویسمش میام و پایین تر جدا مینویسمش که شلوغ نشه و به صورت پرایویت مینویسمش یه متغیره دگیهبه این صورت . دیگه من در داخل استارت تایمرم رو اسکیژول میکنم میگم هر کدام از این واحد های زمانی چند واحد زمانی واقعی باشه دیگه مثلا میگم هر یک ثانیه واحد زمانی واقعی خودمم باشهاین الان یعنی در واقع ده ثانیه باید طول بکشه که این علی برای من اجرا بشه ولی من میتونم سرعتش رو ببرم بالا میگم واحد های زمانی من رو ده میلی ثانیه بذار این چون ده میلی ثانیه واحد مان رو گذاشتیم ده میلی ثانیه طول میکشه که انجام بشه .اصلا اون پریود زمانیش رو از بیرون میگیرم میگم با این بازه زمانی که از بیرون مشخص میکنم بیا برای من انجامش بده که بتونم از بیرون تنظیم کنم .که ویرچوال کلام چطوری کار میکنه توی ران میخوایم چیکارک نه؟یه شمارنده به اسم کلاک تعریف میکنم مساوی با صفر هستش اولش و توی هر تیکش یه دونه میاد برای من اضافه میکنهمیگه کلاک صفرم هستش . . باید ببینه تو این کلاکی که اینجا زدهبرای اینکه ببینم همچین کلاکی وجود داره از کنتینکی استفاده میکنم میگم ایا این کلید رو داری یا نایا این زمان ریجستر شده یا ن حالا میگم این کلاک رو بهش میدماگه ریجستر شده باید اون وظیفه ای که توی اون لحظه هست رو برای من اجرا کنه حالا از گت استفاده میکنم میگم اونی که توی لحظه کلاک هست چیکارش کن ؟ رانش کن . صد در صد ران دارن چرا ؟ چون همشون تسک هستن تسک ها صد در صد ران دارن چه اینه چه اینهر کدام (منظور کلاس ها ) باشه فرقی نداره همشون صد در صد ران رو دارن اگه این کلاس وجود داشت بیا برای من اجرا کنببینیم چطوری اجراش میکنه همینمیگم ویرچوال کلاک رو اجرا کن با بازه های زمانی 1000 میلی ثانیه ای یا همان یک ثانیه ای یه بار اجراش کنیم حالا باید بیاد و اون کار ها رو برای من اجرا کنه تا لحظه ده باید هیچ کاری انجام نده و کلاک چاپ کنه لحظه 10 باید یه ایمیل بفرسته به علی و همین طور تا اخر ببینیم چطوریه خب کلاک صفر هیچی ندارهاینم اضافه کنیم که کلاک بعد از اجرا اضافه بشهلحظه هفت سورت کردن فایل رو داریم لحظه ده ایمیلل فرستاد به علی حالا میتونم شرط بذارم که اگه کاری نداشتی دیگه ادامه نده وگرنه همینطور تا بی نهایت میره دیگه خیلی چیز جالب و خیلی هم کاربردیهنکته خیلی خیلی مهمش چیه ؟ اینه که اوور راید کردم اوور راید یعنی رونویسی کردنرونویسی چه زمانی اتفاق میفته ؟ رو نویسی زمانی اتفاق میفته که شما یه نمونه از سبکلاس هات رو بریزی تو متغیر ادرس حافظه از نوع کلاست وقتی این کار انجام بشه چون داخل سوپر کلاست ران وجود داره و داخل ساب کلاست هم ران وجود داره وقتی این میره تو متیغر ادرس حافظه اش این اتفاق میفته ها .میاد این روبر میداره وو این رو خط خطیش میکنه و رو نویسی میکنه و ران ساب کلاس رو میذاره جاش و این نکته جالبشه چرا چون الان توی لحظه هفت تسک سورت فایل میاد داخل سورت فایل و ران سورت فایل رو اجرا کرد چرا چون وقتی من اومدم و گفتگم ریجستر کن سورت فایل رو این نمونه از نوع سورت فایله اما ورودی ویرچوال کلاسماز نوع تسکه پس میاد روی این ران رو نویسش میکنه در واقعو این رو برای من اجرا میکنه حالا این اجرا شد دوباره همین طور میره و میرسه به دهمیدهمی چیه نگاهش کنید سند ایمیله دیگه نباید بره داخل سورت دیگه میره داخل سند ایمیل و متد ران اون رو در کلاس پدر رو نویسی میکنه و اون رو انجام میده این یکی از قدرت های فوق العاده مهم ای او سی سطح دو به بعد هستش که من میتونم اوو راید کنم در واقع در اصطلاحات برنامه نویسی پیشرفته بهش میگن پلی مرفیست یا چند ریختی