متد سازنده Constructor
چهارشنبه 10 آذر 1389 10:18 PM
فرض کنید میخواهیم در کلاس Time ، هر زمان که شیء ای از این کلاس ساخته میشود، مقادیر ساعت ، دقیقه و ثانیه آن شیء برابر با ساعت و دقیقه و ثانیه ساعت سیستم شوند.در حالت عادی بایستی این کلاس را اینگونه تعریف کنیم:
class Time
{
public int Hour;
public int Minute;
public int Second;
public void InitializeTime()
{
Hour = DateTime.Now.Hour;
Minute = DateTime.Now.Minute;
Second = DateTime.Now.Second;
}
}
کلاس DateTime ، از کلاسهای درون فضای نام System بوده و برای کار با زمان به کار میرود.در این مثال ما توسط این کلاس مقدار ساعت و دقیقه و ثانیه فعلی کامپیوتر را دریافت میکنیم.
اکنون بایستی بلافاصله پس از ایجاد شیء از این کلاس، متد InitializeTime را فراخوانی کنیم.
Time tm = new Time();
tm.InitializeTime();
همانطور که میبینید استفاده از این روش چندان جالب نیست چرا که ممکن است فراخوانی تابع مقدار دهنده فراموش گردد.به خصوص اگر مجبور باشیم چند تابع را پس از تعریف شیء فراخوانی کنیم. در زبانهای شیء گرا ، تکنیکی که در چنین مواقعی استفاده میشود استفاده از توابع سازنده است.
هدف از سازنده، تخصيصدهي اعضاي كلاس در زمان ايجاد نمونهاي جديد از كلاس است. سازندهها داراي مقادير بازگشتي نبوده و همواره نامي مشابه نام كلاس دارند. سازنده ها همواره به صورت public ميباشند.
پس میتوانیم کلاس فوق را اینگونه پیاده سازی کنیم :
class Time
{
public int Hour;
public int Minute;
public int Second;
public Time()
{
Hour = DateTime.Now.Hour;
Minute = DateTime.Now.Minute;
Second = DateTime.Now.Second;
}
}
سپس شیء را تعریف میکنیم:
تعریف سازنده ها اجباری نیست. در صورتی که ما در کلاسی ، تابع سازنده نداشته باشیم مشکلی ایجاد نمی شود.
عبارت new Time() در حقیقت فراخوانی تابع سازنده است.به همین دلیل است که نام تابع سازنده با نام کلاس بایستی یکسان باشد.
میتوانیم در یک کلاس چند سازنده داشته باشیم یا به عبارت دیگر تابع سازنده را سربارگذاری کنیم. مثلا فرض کنید میخواهیم در هنگام ایجاد شیء، بنا به در خواست برنامه نویس ، مقادیر فیلدهای ساعت و دقیقه و ثانیه با ساعت فعلی سیستم مقدار دهی گردند یا اینکه با مقادیر دلخواه برنامه نویس. پس برای این کار برنامه را اینگونه مینویسم:
class Time
{
public int Hour;
public int Minute;
public int Second;
public Time()
{
Hour = DateTime.Now.Hour;
Minute = DateTime.Now.Minute;
Second = DateTime.Now.Second;
}
public Time(int h, int m, int s)
{
Hour = h;
Minute = m;
Second = s;
}
}
و اشیاء را اینگونه تعریف میکنیم:
Time FirstTime = new Time();
Time SecondTime = new Time(10, 10, 10);
4-2-1-2 متد مخرب
این متد به طور خودکار در لحظه از بین رفتن شیء فراخوانی میشود.از آنجایی مدیریت حافظه در دات نت بر عهده CLR میباشد ، زمان از بین رفتن شیء کاملا مشخص نیست. تخريبكنندهها معمولاً زماني فراخواني ميشوند كه Garbage Collector زبان C# تصميم به حذف شيء مورد استفاده برنامه از حافظه و آزادسازي منابع سيستم، گرفته باشد. (Garbage Collector يا GC، يكي از امكانات .Net Framework است كه سيستم بصورت اتوماتيك اقدام به آزادسازي حافظه و باز گرداندن منابع بلا استفاده به سيستم مينمايد. فراخواني GC بصورت خودكار رخ ميدهد.
این متد همنام کلاس بوده و نام آن با علامت ~ شروع میگردد، پارامتر ورودی و مقدار خروجی ندارد.
~Time()
{
Console.WriteLine("an object destroyed");
}