PDA

View Full Version : آموزش: چرا با اینکه ما در abstract class یک سازنده داریم اما نمی تونیم براش نمونه بسازیم ؟



RIG000
شنبه 14 مرداد 1396, 00:13 صبح
اگر ما در زمینه کامپیوتر در نظر بگیریم که برنامه نویس تازه کار و متوسط و مدیر ارشد داشته باشیم. باید بدونیم بالاتر از همه ی اینها کسی هست که بهش میگن معمار پروژه . این شخص کسی هست که پایه پروژه رو میزنه و بایستی اینکار رو دقیق انجام بده چون زیر ساخت مهم ترین اصل کار پروژه به حساب میاد .

در زبان سی شارپ ما میدونیم که چه فرق هایی بین interface ‌و abstract هست . البته اگر دوستانی که هنوز اشنایی ندارند لطفا تفاوت های این دو رو بخونند و سپس بیان ادامه خط بعدی چون براشون نامفهوم میشه .
وقتی کلاسی رو ما از نوع abstract میگیریم یعنی هدف ما از ساخت این کلاس این هست که باید در کلاس های derived ارث بری (inherit) بشه .
از اونجایی که کلاس ابسترکت به صورت incomplete هست و عملا کلاسی بین class و interface پ شباهت هایی از هر دو و تفاوت هایی نسبت به هر دو داره .
به طور مثال تفاوتش با Class اینه که ازش نمیشه instance ساخت و شباهتش با interface در این هست که متد های pure داره .
در این صورت ما میدونیم که interface سازنده نداره و نحوه کار با interface اینه که ما فقط در اون signature رو مشخص میکنیم ولی ابسترکت می تونه متد پیاده سازی شده داشته باشه و هم نه (pure).
در نهایت چرا ابسترکت سازنده داره اما هنوز نمیتونیم از instance داشته باشیم؟
دلیل اینکه میگن چون سازنده اون به طور پیش فرض protected ایجاد شده (در مورد access modifier ها بخونید) . و تنها با ارث بری قایلیت دسترسی رو در سازنده کلاس derived براش داریم (base) .
اما واقعا دلیل اصلی اینه که طراحان سی شارپ در نظر گرفتن که زمانی که abstract class چون incomplete هست و واسه همین دارای متد pure هست اومدن سازنده اون رو protectedدر نظر گرفتن تا دیگه وقتی معمار پروژه در پروژه از این کلاس استفاده میکنه (کلاس های پایه ای در یک فریم ورک که پروژه بر اون پیاده سازی میشه) نتونه ازش نمونه ساخته بشه تا وقتی که اگر به فرض ساخته میشد ما با فراخوانی متد pure به ارور میخوردیم که اصلاحا متد بدون پیاده سازی شده رو فراخونی کردن ! و این موضوع از اصول طراحی به دور بود .