در مورد Upcast توي پست قبلي صحبت كرديم. اما حالا مي خواهيم در مورد DownCast صحبت كنيم.

به كد زير دقت كنين:
     Emp e = new Emp("Ali",24,120000);
Person p = e;

حالا فرض كنين كه من مجددا مي خواهم يك Reference از جنس Emp به شيء p داشته باشم. يعني اينكه مجددا "ديدم" رو از سطح بالا (Person) به سطح پائين تر (Emp) تغيير بدم. اينكار به صورت پيش فرض (implicit - غير صريح) امكان پذير نيست و در صورتيكه شما بخواهيد اين كار را انجام دهيد حتما بايد صراحتا (explicit) مسئوليت اين كار را به عهده بگيريد (casting).

اجازه بدين اين موضوع رو با يك مثال ساده بيشتر توضيح بدم.

يك نمايشگاه كه همه افراد اجازه بازديد دارند رو در نظر بگيرين. حالا داخل اين نمايشگاه شما به يكي از افراد اشاره مي كنين مي گين كه شما يك كارمند هستين!! آيا اين امكان پذير است؟ مسلما نه. مگر اينكه شما فرد مورد نظر رو بشناسين و بدانين كه ايشان يك كارمند هستند.


حالا اگر اين داستان رو در دنياي برنامه نويسي هم دنبال كنيم وقتي شما يك متد دارين كه ورودي آن اشيايي از جنس Person هستند. حالا شما مي خواهين يك Reference از جنس Emp به يكي از اين اشياء داشته باشين. اين كار امكان پذير نيست مگر اينكه شما مطمئن باشيد كه اين فرد يك كارمند بوده و در هنگاه اجراي اين متد با استفاده از Upcast وارد اين متد شده است.

Casting
حالا اگر شما مطمئن بوديد كه يك فرد واقعا يك كارمند است و خواستين كه عمل Downcast را انجام دهيد بايد مسئوليت اينكار را بعهده بگيريد. براي اينكار كافيست به صورت زير عمل كنين:
 Emp e2 = (Emp) p;

همانطور كه مي بينين عمل Casting يا همان مسئوليت پذيري با استفاده از دو پرانتز و بعد جنس مورد نظر صراحتا اعلام شده است (explicit).

همانطور كه در تصوير مي بينين در DownCast در حقيقت شما "ديدتان را گسترش" مي دهيد و اين كار هيچ تغييري در ماهيت شيء شما ايجاد نمي كند. حالا اگر شما با استفاده از Casting مسئوليت يك DownCast غير متعبر را به عهده بگيرين با يك خطاي runtime برخورد خواهيد كرد:
     Person p = new Person("Reza", 45);
Emp e = (Emp) p;

عمل DownCast با شكست مواجه خواهد شد. زير اطلاعات مورد نياز در شيء p براي تبديل شدن به Emp وجود ندارد.