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

به شكل زير نگاه كنين. كلاس Person داراي "Name"و "Age" و متد "Print" مي باشد. و كلاس Emp كه از كلاس Person به ارث رفته يك فيلد به نام "Salary" نيز دارد.



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

Emp e = new Emp();
e.Name = "Ali";
e.Age = 45;
e.Salary = 120000;

اما اگر من يك reference به شيء "e" از جنس Person ايجاد كنم فقط و فقط مي توانم اطلاعات مربوط به Person را استفاده كنم:



در واقع رفتار 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);

پس همانطور كه مي بينيم عمل Upcast يكي از پر استفاده ترين اعمال در سي شارپ مي باشد.

! قبلا هم گفتيم كه تمامي كلاس ها در سي شارپ از يك كلاس خاص به نام object به ارث رفته اند. حالا اگر من يك آرايه بخواهم كه بتوانم داخلش هر نوع شيء اي رو قرار بدم كافيه كه يك آرايه از جنس object بسازم و بعد هر شيء كه دوست داشتم رو داخلش قرار بدم.

اين پست همچنان ادامه دارد....