فراخواني سازنده ها - Constructor Calling

وقتي از يك كلاس كه يك كلاس ديگر به ارث رفته است , شيء‌ مي سازيم در واقع متد سازنده آن كلاس و تمامي كلاس هايي كه به عنوان پدر اين كلاس مطرح هستند را نيز فراخواني مي نمائيم. به عنوان مثال كلاس Customer از كلاس Person به ارث رفته است. در كلاس Person من دو نوع Constructor‌ دارم. يكي همان Default Constructor است كه به صورت public و بدون پارامتر تعريف شده و ديگر داراي دو پارامتر است. يكي از جنس String‌ كه نام فرد است و ديگري از جنس int كه سن فرد مي باشد:

public class Person
{
public int Age;
public string Name;

public Person()
{
Console.WriteLine("Default Constructor of Person Called");
}
public Person(string Name, int Age)
{
this.Name = Name;
this.Age = Age;
Console.WriteLine("2nd Constructor of Person Called");
}

public virtual void Print()
{
Console.WriteLine("Name: {0}, Age: {1}", Name, Age);
}
}


همانطور كه مي بينيد من براي اينكه مشخص بشه كه از كدام Cosntructor‌ استفاده مي شود در هر دو Constructor‌ يك جمله چاپ مي كنم.

حالا كلاس Customer‌ را از كلاس Person‌ به ارث مي بريم:

public class Customer : Person
{
public decimal Credit;

override public void Print()
{
Console.WriteLine)"Name: {0}, Age: {1}, Credit: {2}", Name, Age, Credit);
}
}


حالا براي تست يك شيء از كلاس Customer ايجاد مي كنم:

Customer C = new Customer();
c.Name = "Ali";
c.Age = 20;
c.Credit = 2000;
c.Print();


كه در نتيجه در محيط Console‌ خروجي شبيه به اين خواهيم داشت:



همانطور كه در خروجي هم مشخص شده است , با اينكه من Constructor كلاس فرزند را فراخوني كردم اما Default Constructor كلاس پدر نيز فراخواني شده است.

نكته اي كه وجود دارد اين است كه وقتي شما مشخص نكنين كه كدام ‍Constructor‌ از كلاس پدر فرخواني شود سازنده پيش فرض كلاس پدر فراخواني خواهد شد.

اما در صورتيكه نخواهيم سازنده پيش فرض فراخواني شود بايد چه كنيم؟ يا اگر در كلاس پدر سازنده پيش فرض نداشتيم چطور؟

در صورتيكه شما مي خواهيد يكي از سازنده هاي پدر را صراحا خودتان اعلام كنين كافي است كه در مقابل تعريف سازنده خود از كلمه base استفاده كنين:

public Customer(string Name, int Age, decimal Credit): base(Name,Age)
{
this.Credit = Credit;
Console.WriteLine("Customer Constructor called");
}

حالا اگر مجددا يك شيء از كلاس Customer ايجاد كنين , نتيجه اي متفاوت خواهيد داشت:



همانطور كه در تصوير خروجي هم مشخص است. ابتدا سازنده پدر فرخواني شده (كه البته با اين روش من كد كمتري هم نوشته ام و از كدي كه سازنده پدر وجود دارد استفاده مجدد كرده ام) و بعد سازنده كلاس Customer.

دانلود مثال اين پست

ادامه دارد...