آموزش سي شارپ - قسمت شانزدهم - 2
صحبت هامون به اونجا رسيد كه گفتم شما مي تونين يك شيء از نوع فرزند رو به چشم يك شيء از جنس پدر ببينيد كه به اين عمل اصطلاحا "Upcast" گفته مي شود. يك مثال ساده هم ازش زديم و گفتيم كه اگر شما يك كارمند داشته باشين مي تونين اونو به چشم يك انسان نگاه كنين و در نتيجه از اطلاعاتي كه همه انسان ها دارند روي آن فرد خاص هم استفاده كنيم.
واقعيت اين است كه وقتي شما يك شيء از جنس فرزند دارين در حافظه Heap تمامي اطلاعات موجود به آن وجود دارند ولي وقتي شما به آن شيء با Reference پدر كار كنين فقط و فقط اطلاعاتي رو مي توانين استفاده كنين كه در پدر وجود دارند.
به شكل زير نگاه كنين. كلاس Person داراي "Name"و "Age" و متد "Print" مي باشد. و كلاس Emp كه از كلاس Person به ارث رفته يك فيلد به نام "Salary" نيز دارد.

حالا اگر من يك شيء از جنس Emp بسازم طبق اصولي كه گفتيم بايد تمامي متد ها و field هاي پدر + اطلاعات خودش را داشته باشد.

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

البته شايد اين مثال كمي به نظرتون عجيب برسه! واقعيت اينه كه مثلا بالا شايد كمي غير واقعي باشه. اجازه بدين مثالمون رو اينجوري ادامه بديم.
فرض كنين كه شما يك متد دارين كه ورودي آن يك آرايه از اشياء از جنس Person مي باشد و بعد داخل اين متد اطلاعات شيء ها را يكي يكي چاپ مي كنيم:
حالا شما مي خواهين اين متد را فراخواني كنين ولي شما 3 شيء از جنس كارمند دارين. آيا مي توانين يك آرايه از اشيايي با جنس كارمندان را به متد بالا پاس دهيد؟؟؟
! قبلا هم گفتيم كه تمامي كلاس ها در سي شارپ از يك كلاس خاص به نام object به ارث رفته اند. حالا اگر من يك آرايه بخواهم كه بتوانم داخلش هر نوع شيء اي رو قرار بدم كافيه كه يك آرايه از جنس object بسازم و بعد هر شيء كه دوست داشتم رو داخلش قرار بدم.
اين پست همچنان ادامه دارد....
واقعيت اين است كه وقتي شما يك شيء از جنس فرزند دارين در حافظه Heap تمامي اطلاعات موجود به آن وجود دارند ولي وقتي شما به آن شيء با Reference پدر كار كنين فقط و فقط اطلاعاتي رو مي توانين استفاده كنين كه در پدر وجود دارند.
به شكل زير نگاه كنين. كلاس Person داراي "Name"و "Age" و متد "Print" مي باشد. و كلاس Emp كه از كلاس Person به ارث رفته يك فيلد به نام "Salary" نيز دارد.

حالا اگر من يك شيء از جنس Emp بسازم طبق اصولي كه گفتيم بايد تمامي متد ها و field هاي پدر + اطلاعات خودش را داشته باشد.
Emp e = new Emp();
e.Name = "Ali";
e.Age = 45;
e.Salary = 120000;

در واقع رفتار Compiler سي شارپ به صورت شكل زير خواهد بود:
البته شايد اين مثال كمي به نظرتون عجيب برسه! واقعيت اينه كه مثلا بالا شايد كمي غير واقعي باشه. اجازه بدين مثالمون رو اينجوري ادامه بديم.
فرض كنين كه شما يك متد دارين كه ورودي آن يك آرايه از اشياء از جنس Person مي باشد و بعد داخل اين متد اطلاعات شيء ها را يكي يكي چاپ مي كنيم:
public void PrintList(Person[] list)
{
foreach(Person p in list)
p.Print();
}
حالا شما مي خواهين اين متد را فراخواني كنين ولي شما 3 شيء از جنس كارمند دارين. آيا مي توانين يك آرايه از اشيايي با جنس كارمندان را به متد بالا پاس دهيد؟؟؟
Emp = e = new Emp("Ali",34,12000);
Emp e2 = new Emp("Reza",33,10000);
Emp e3 = "Saeid",28,20000);
// ساختن يك آرايه از Person با استفاده از اشيايي از جنس Emp
Person[] myList = new Person[]{e,e2,e3};
PrintList(myList);
! قبلا هم گفتيم كه تمامي كلاس ها در سي شارپ از يك كلاس خاص به نام object به ارث رفته اند. حالا اگر من يك آرايه بخواهم كه بتوانم داخلش هر نوع شيء اي رو قرار بدم كافيه كه يك آرايه از جنس object بسازم و بعد هر شيء كه دوست داشتم رو داخلش قرار بدم.
اين پست همچنان ادامه دارد....
+ نوشته شده در چهارشنبه هشتم اسفند ۱۳۸۶ ساعت 11:43 توسط مسعود طباطبايي | MasoudTB
|