در قسمت چهارم آموزش شی گرایی در رابطه با سازنده ها که مبحث بسار مهمی در شی گرا میباشد و توابع پایانی Finalizers و همچنین توابع و عناصر static صحبت شده.
سازنده ها در کلاس درای چندین ویژگی میباشند مانند ۱-هم نام کلاس هستند ۲-هیچ نوع و مقدار خروجی ندارند حتی void 3-میتوان هیچ یا چندین پارامتر ورودی داشته باشند ۴-یک کلاس میتواند چندین سازنده داشته باشد
سازنده ها معمولا برای مقداردهی اولیه به فیلد های کلاس میباشد در صورتی که هیچ سازنده ای برای کلاس مشخص نکنیم کامپایلر از کلاس پیشفرض خود استفاده میکند و به تمامی فیلدها مقادیر خالی و null میدهد.
به مثال زیر توجه کنید
public Product() { Name = "No_Name"; price = 0; }
عبارات فوق که کدهای مربوط به ایجاد سازنده میباشد را درون فایل کلاس قرار داده و عبارات زیر که مقادیر فیلد هارا در خروجی نمایش میدهد را درون main مینویسیم
static void Main(string[] args) { Product obj = new Product(); Console.WriteLine(obj._name + " " + obj._price); Console.ReadKey(); }
و پس از اجرا خروجی زیر را خواهیم داشت
//output
No_Name ۰
در مثال زیر نیز ابتدا سازنده ای با پارامتر به شکل زیر ایجاد شده
public Product (string name,double price) { this.Name = name; this.price = price; }
عبارات فوق همانگونه که مشخص است سازنده ای با دو پارامتر(میتوان با یک پارامتر هم ایجاد کرد)ایجاد شده که در بدنه آن از کلمه کلیدی This استفاده شده (که این کلمه به فیلد ها و تمام اعضا کلاس جاری اشاره دارد برای مثال خط اول به فیلد Name در کلاس جاری اشاره میکند.معمولا از این کلمه زمانی استفاده میشود که نام فیلد و نام پارامترها مشابه باشد تا خوانایی برنامه بالاتر برود) و مقادیری که توسط پارامترها به سازنده ارسال میشود را درون فیلد ها قرار میدهد.
سپس در main برنامه تنها خط ایجاد شی به شکل زیر تغییر میکند
همانگونه که در تصویر فوق مشاهده میفرمایید هنگام ایجاد شی لیستی را نمایش میدهد که مشخص میکند کلاسی که الان مدنظر است دارای ۲ سازنده میباشد که با فلش میتوان ساختار هرکدام را دید که در این مثال ما از سازنده باپارامتر استفاده کرده ایم و مقادیری هم برای هر کدام ارسال کرده ایم پس نتیجه زیر را خواهیم داشت
OutPut//
T_Shirt ۵۰۰۰۰
اینگونه از توابع همانگونه که از نامش مشخص است زمانی که پایان اجرای برنامه فرا میرسد یعنی زمانی که حافظه میخواهد فضای خودش را از برنامه پس بگیرد یک عکس العمل مشخص شده انجام میدهد همچنین به این نکته توجه فرمایید که این توابع تنها کافیست در فایل کلاس براساس قوانین مشخص نوشته شود و دیگر نیازی نیست که در قسمت main فراخوانی شود بلکه کامپایلر خود در انتها این تابع را اجرا میکند.
برای مثال برنامه زیر هنگام اتمام برنامه عبارت END را نمایش میدهد و برنامه بسته میشود
~Product() { Console.WriteLine("END"); }
همانگونه که مشخص شده برای ایجاد اینگونه توابع که حتما باید هم نام کلاس باشد و برخلاف سازنده هر کلاس تنها میتواند یک Finalizers داشته باشد.
کلاس ها و اعضا ایستا دارای ویژگی خاصی هستند که برخلاف کلاس های معمولی نمیتوان از آنها شی یا نمونه ایجاد کرد بلکه در صورتی که بخواهیم مثلا به متدهای کلاس دسترسی پیدا کنیم بجای ایجاد شی و سپس فراخوانی(کاری که تابحال انجام داده ایم) تنها کافیست نام کلاس را نوشته و سپس متد یا هرعضو دیگر (که بصورت Public تعریف شده باشد) را فراخوانی کنیم.
برای مثال ما کلاس جدیدی ایجاد کرده ایم که از نوع static باشد برای اینکار تنها کافیست پس از ایجاد کلاس از مسیری که قبلا گفته شده قبل از عبارت Class و نام کلاس کلمه کلیدی Static را قرار دهیم سپس کلاس ما به کلاس static تبدیل میشود با ویژگی های گفته شده
static class StaticClass { public static int s; static int z; public static int Add(int x , int y) { return x + y; } }
همانگونه که مشاهده میکنید ما کلاس StaticClass را ایجاد کرده و سپس آنرا به کلاسی از نوع static تبدیل کرده ایم در بدنه آن نیز دو فیلد که هر دو آنها نیز با عبارت static تعریف شده اند و یکی به صورت public و دیگری نیز بدون تعیین سطح دسترسی(به طور پیشفرض Private تعیین میشود) ایجاد شده و یک متد ساده Add برای جمع کردن دو مقدار که متد ها نیز باید به صورت static باشد.
حال در main برنامه اگر بخواهیم از این کلاس یک شی ایجاد کنیم با خطا مواجه میشویم چون این کلا ساز نوع static میباشد به همین دلیل نام کلاس را نوشته سپس میتوان با گذاشتن یک علامت دات (.) به تمامی اعضا کلاس که البته از نوع public تعریف شده اند دسترسی پیدا کرد مانند تصویر زیر
*نکته قابل توجه در رابطه با اینگونه کلاس ها این است که سازنده های درون اینگونه کلاسها باید حتما بصورت static و بدون سطح دسترسی باشد و ویژگی دیگر سازنده های static این است که نمیتوان آنهارا مانند سازنده های instance صدازد و در واقع این گونه سازنده ها قبل از ورودی یک شی(در واقع مبحث ما الان بروی کلاسهایی است که خود کلاس از نوع استاتیک نمیباشد اما عناصر آن بصورت استاتیک میباشد چون از کلاس استاتیک که نمیشود شی ایجاد کرد) به حافظه ساخته میشوند و اگر تابع سازنده با مشکل برخورد کرد کل عملیات سازنده متوقف شده و مقدار null میشود و ما هیچ کنترلی بروی آن نداریم.
*نکته دیگر این است که اگر ما کلاسی داشته باشیم که از نوع static نباشد ولی عناصر درونش از نوع static باشد باید مقداردهی اولیه آن را از طریق سازنده static درون همان کلاس انجام داد که همانگونه که گفته شد این سازنده ها قبل از اینکه هر شی از این کلاس ساخته شود اجرا میشوندو مقداردهی انجام میشود و اگر به هر دلیلی سازنده اجرا نشود هیچ شیی ایجاد نمیشود.
*نکته دیگر در رابطه با کلاس های استاتیک این است که این کلاس ها بصورت ضمنی بصورت Sealed هستند و قابل ارث بری نیستند.
*نکته قابل توجه دیگر این است که کلاس استاتیک میتواند به نحو دیگر نیز پیاده سازی شود به نحوی که میتوان کلاس را از نوع استاتیک تعیین نکنیم اما در عوض درون بدنه کلاس باید تنها اعضا استاتیک داشته باشد و دارای سازنده Private باشد چون توسط سازنده Private هیچگاه نمیتوان شی از کلاس ایجاد کرد پس از این طریق این کلاس هم مانند کلاس استاتیک هیچ گونه شیی نمیتوان درون برنامه اصلی داشته باشد و باید مانند کلاس های استاتیک با ذکر نام کلاس به اعضا درون آن دسترسی پیدا کرد.