لطفا کدی را که قابل اجرا نیست برای Trace کردن قرار ندهید، کد اشکال داشت و ویرایش گردید :
کد:
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
class high
{
protected static int c = 0;
public high()
{
c++;
}
public high (int z)
{
System.Console.WriteLine("{0} said I am the {1} from high !", z, c);
}
}
class middle : high
{
public middle () {}
public middle (int z)
{
low i = new low (z-4);
System.Console.WriteLine("{0} I am the {1} from middle !", z,c);
for (int j=2 ; j<6 ; j++)
{
high h = new high ();
}
}
}
class low : middle
{
public low (int z)
{
System.Console.WriteLine("{0} I am the {1} from low !", z,c);
high h = new high (z + 4);
}
}
class program1_2
{
static void Main(string[] args)
{
int [] x = new int[] {90 , 23 , -12 , 13 , 20};
low i = new low(x[2]);
middle m = new middle (x[1]);
high h = new high(x[0]);
System.Console.ReadKey(true);
}
}
}
پیش از آنکه تابع main برنامه را بررسی کنیم، بایستی عملکرد کلاس ها را مشخص باشد :
کلاس high شامل یک متغیر به نام c است با مقدار اولیه 0 . این متغیر static است، پس برای کلیه شیء هایی که از این
کلاس (و کلاس های وارث) ساخته می شود، صرفا یک مقدار مشترک c وجود خواهد داشت :
کد:
class high
{
protected [B]static[/B] int [B]c[/B] = 0;
و تابع سازنده آن (همنام کلاس است) که بدون پارامتر ورودی است، صرفا مقدار c را یک واحد افزایش می دهد :
کد:
public high()
{
[B]c++[/B];
}
تابع سازنده دومی هم تعریف شده که یک پارامتر ورودی int دارد و مقدار متغیر ورودی و مقدار متغیر c را در خروجی
چاپ می کند :
کد:
public high (int [B]z[/B])
{
System.Console.WriteLine("{0} said I am the {1} from high !", [B]z[/B], [B]c[/B]);
}
کلاس middle از کلاس high ارث بری می کند و به عنوان وارث کلاس high، آن متغیر c را بدون کد نویسی خواهد داشت :
تابع سازنده بدون پارامتر ورودی کلاس middle هیچ کاری انجام نمی دهد، (دقت کنید که تابع سازنده بدون پارامتری
که از کلاس high به ارث رسیده، در همان ابتدای ایجاد شدن شی middle و در هر شرایطی اجرا می شود ) :
تابع سازنده ای هم در کلاس middle تعریف شده که یک پارامتر ورودی int دارد (همانند کلاس high) ( دقت کنید که
تابع سازنده با پارامتر ورودی که از کلاس high به ارث رسیده اجرا نخواهد شد ولی تابع سازنده بدون پارامتری
که از کلاس high به ارث رسیده، در همان ابتدای ایجاد شدن شی middle و در هر شرایطی اجرا می شود ) :
کد:
public middle (int [B]z[/B])
{
در داخل این تابع سازنده، از نوع کلاس low (ما هنوز کلاس low را بررسی نکردیم) شیئی تعریف شده :
و همانند کلاس high مقدار متغیر ورودی و متغیر c در خروجی چاپ می شود :
کد:
System.Console.WriteLine("{0} I am the {1} from middle !", [B]z[/B],[B]c[/B]);
و از نوع کلاس high (کلاس والد) چندین شیء (4 شیء) تعریف می شود :
کد:
for (int j=2 ; j<6 ; j++)
{
high h = new high ();
}
کلاس low از کلاس middle ارث بری می کند، پس از کلاس high هم ارث بری خواهد کرد :
تابع سازنده بدون پارامتری برای low تعریف نشده است، پس همانند تابع سازنده بدون پارامتر middle خواهد بود که
کار خاصی نمی کرد (دقت کنید که تابع سازنده بدون پارامتری که از کلاس high به ارث رسیده و سپس تابع سازنده
بدون پارامتری که از کلاس middle به ارث رسیده در همان ابتدای ایجاد شدن شی و در شرایطی اجرا می شود)
تابع سازنده با یک پارامتر ورودی int برای کلاس low تعریف شده که مقدار متغیر ورودی و متغیر c در خروجی چاپ می کند
و سپس از نوع کلاس high یک شیء می سازد (توابع سازنده بدون پارامتری که از کلاس high و middle به ارث رسیده
در همان ابتدای ایجاد شدن شی و در شرایطی اجرا می شود) :
کد:
public low (int z)
{
System.Console.WriteLine("{0} I am the {1} from low !", [B]z[/B],[B]c[/B]);
high h = new high (z + 4);
}
خب، حالا می توانیم بر اساس خروجی هایی که هر کلاس چاپ می کند بررسی شان کنیم :
کلاس high :
کلاس high اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی):
هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد.
کلاس high اگر با پارامتر ورودی int ایجاد شود :
مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند (مقدار c تغییری نخواهد کرد).
کلاس low :
کلاس low اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی) :
هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد (تابع سازنده high).
کلاس low اگر با پارامتر ورودی int ایجاد شود، مراحل زیر را طی می کند :
1) ابتدا مقدار c یک واحد افزایش خواهد یافت (تابع سازنده high)
2) مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند.
3) یک شیء از کلاس high خواهد ساخت که مقدار متغیر ورودی اش 4 تا بیشتر است.
مراحلی که بعد از ساختن این شیء high طی می شود همانند شرح خروجی کلاس high است که قبلا ذکر شده :
3-1) تابع سازنده کلاس high مقدار متغیر ورودی (4 واحد افزایش یافته) و متغیر c (بدون تغییر) را در یک سطر
چاپ می کند (مقدار c در high تغییری نخواهد کرد).
کلاس middle :
کلاس middle اگر بدون پارامتر ورودی ایجاد شود (کلاس سازنده بدون پارامتر ورودی) :
هیچ خروجی ای نخواهد داشت ولی مقدار c را یک واحد افزایش می دهد (تابع سازنده high).
کلاس middle اگر با پارامتر ورودی int ایجاد شود مراحل زیر را طی می کند :
1) مقدار c را یک واحد افزایش می دهد (تابع سازنده high)
2) ابتدا یک شیء از کلاس low خواهد ساخت که مقدار متغیر ورودی اش 4 تا کمتر است.
مراحلی که بعد از ساختن این شیء low طی می شود همانند شرح خروجی کلاس low است که قبلا ذکر شده :
2-1) ابتدا مقدار c یک واحد افزایش خواهد یافت (تابع سازنده high)
2-2) بعد از آن در شیء low ساخته شده، مقدار متغیر ورودی (4 واحد کاهش یافته) و متغیر c (یک واحد افزایش یافته)
را در یک سطر چاپ می کند.
2-3) در ادامه در همان شیء low، یک شیء از کلاس high ایجاد می شود که مقدار متغیر ورودی اش 4 واحد بیشتر است
(از مقدار فعلی که در شیء low دارد).
مراحلی که بعد از ساختن این شیء high طی می شود همانند شرح خروجی کلاس high است که قبلا ذکر شده :
2-3-1) در تابع سازنده کلاس high مقدار متغیر ورودی (4 واحد افزایش یافته) و متغیر c را در یک سطر
چاپ می کند (مقدار c در high تغییری نخواهد کرد).
3) در ادامه شیء middle مقدار متغیر ورودی و متغیر c را در یک سطر چاپ می کند.
4) در یک حلقه چهار شیء از کلاس high ایجاد می کند که بدون پارامتر ورودی فراخوانی می شوند (تابع سازنده بدون پارامتر)
همانطور پیش از مراحل اجرای یک شیء high ذکر شده، صرفا مقدار c چهار بار افزایش می یابد ولی خروجی ای نخواهد داشت.
حالا می توانیم روند اجرای تابع main را بررسی کنیم :
ابتدا یک آرایه int با پنج عضو ایجاد می شود :
کد:
static void Main(string[] args)
{
int [] x = new int[] {90 , 23 , -12 , 13 , 20};
یک شیء از کلاس low با پارامتر ورودی 12- ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 2 از آرایه x سومین
عنصر آرایه x است)
روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس low با پارامتر ورودی ارائه شد،
پس دو سطر در خروجی چاپ خواهد شد و مقدار c به 1 خواهد رسید.
یک شیء از کلاس middle با پارامتر ورودی 23 ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 1 از آرایه x دومین
عنصر آرایه x است)
روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس middle با پارامتر ورودی ارائه شد،
پس سه سطر در خروجی چاپ خواهد شد و مقدار c به 7 خواهد رسید.
کد:
middle m = new middle (x[1]);
یک شیء از کلاس high با پارامتر ورودی 90 ایجاد می شود (اندیس ها از 0 شروع می شوند پس اندیس 0 از آرایه x اولین
عنصر آرایه x است)
روند ایجاد شدن این شی مطابق مراحلی است که در شرح ایجاد شدن یک شی از کلاس high با پارامتر ورودی ارائه شد،
پس یک سطر در خروجی چاپ خواهد شد و مقدار c تغییری نخواهد کرد (در عدد 7 باقی می ماند).