آموزش سي شارپ - قسمت بيستم
Polymorphism in CSharp - چند ريختي در سي شارپ
بررسي مفهوم overriding را با يك مثال پيگيري مي كنيم. يك سازمان يا شركت را در نظر بگيريد. اين شركت داراي دو نوع كارمند مي باشد. نوع اول كارمندان حقوق بگيري هستند كه حقوقشان را به صورت ماهيانه و با توجه به پايه حقوقي ثابتي كه برايشان در نظر گرفته شده است دريافت مي كنند. به عنوان مثال "علي رضايي" يك كارمند حقوق بگير است كه براي هر ماه مبلغ "100,000" دريافت مي كند.
بررسي مفهوم overriding را با يك مثال پيگيري مي كنيم. يك سازمان يا شركت را در نظر بگيريد. اين شركت داراي دو نوع كارمند مي باشد. نوع اول كارمندان حقوق بگيري هستند كه حقوقشان را به صورت ماهيانه و با توجه به پايه حقوقي ثابتي كه برايشان در نظر گرفته شده است دريافت مي كنند. به عنوان مثال "علي رضايي" يك كارمند حقوق بگير است كه براي هر ماه مبلغ "100,000" دريافت مي كند.
نوع دوم كارمنداني هستند كه به صورت ساعتي حقوقشان را دريافت مي كنند و براي هر ساعت كار يك مبلغ مشخصي دريافت مي كنند. به عنوان مثال "رامين احمدي" يك كارمند ساعتي است كه براي هر ساعت كار مبلغ "3000" دريافت مي كند.
در اين مثال باتوجه به اينكه تمامي كارمندان داراي اطلاعات مشتركي هستند (مثل نام و شماره كارمندي و اطلاعات سوابق و ....) تصميم گرفتيم يك كلاس پايه به نام Emp كه مخفف Employee است در نظر بگيريم و اطلاعات مشترك را در اين كلاس تعريف كنيم:
همانطور كه مي بينين با توجه به اينكه مفهوم حقوق براي كلاس كارمند (بدون مشخص بودن نوعش) يك مفهوم انتزاعي است من در اين مثال حقوق (يا همان Salary) را به صورت virtual تعريف كرده ام , تا كلاس هايي كه از كلاس Emp به ارث مي روند با override كردن اين Property پياده سازي درست آن را در نوع خود انجام دهند.
پس دو كلاس MonthlyEmp و HourlyEmp را كه از كلاس پايه Emp به ارث رفته اند به صورت زير تعريف خواهند شد:
.GIF)
در كلاس MonthlyEmp (كه در واقع كارمند حقوق بگير ماهيانه مي باشد) حقوق بر اساس "پايه حقوق" محاسبه مي شود.

همانطور كه در كد مي بينيد , در كلاس HourlyEmp (كه همان كارمند ساعتي است) حقوق براساس "مبلغ پايه هر ساعت" * "تعداد ساعات كاركرد" محاسبه و پرداخت و خواهد شد.

همانطور كه در كد مي بينيد , در كلاس HourlyEmp (كه همان كارمند ساعتي است) حقوق براساس "مبلغ پايه هر ساعت" * "تعداد ساعات كاركرد" محاسبه و پرداخت و خواهد شد.
مثال را بايد ايجاد يك كلاس چهارم به نام Company تكميل مي كنيم. در اين كلاس يك آرايه از كارمند (Emp) داريم. دليل اينكار كاملا آشكاراست. چون احتمال ايجاد كلاس هاي جديد (در واقع نوع هاي كارمندان جديد) وجود دارد در نتيجه من يك آرايه از كلاس پدر كه همان Emp است براي نگهداري ليست كارمندان ايجاد مي كنم.
.GIF)
همانطور كه در كد مي بينين يك متد به نام PaySalary در اين كلاس ايجاد شده كه در واقع هر ماه يكبار توسط مدير عامل شركت جهت پرداخت حقوق تمامي كارمند استفاده مي شود. صرف نظر از اينكه در موقع فراخواني واقعا چه نوع كارمندي در اين آرايه پر شده است , انتظار من اين است كه اگر كارمند ساعتي بود از روش محاسبه كارمند ساعتي و اگر كارمند حقوق بگير بود از روش محاسبه كارمند حقوق بگير حقوق افراد پرداخت شود. اين دقيقا همان نكته ايست كه در فقط در مواقعي كه شما از overridingاستفاده كنين اتفاق خواهد افتاد. به عبارت ديگر "در overriding صرف نظر از نوع ديدگاه ما (reference) به يك شيء , ماهيت آن مشخص كننده فراخواني متد پدر يا فرزند خواهد بود" يعني اگر حتي reference ما به يك شيء MonthlyEmp از نوع Emp باشد (يعني عمل upcase اعمال شده باشد) باز در مواقع فرخواني متد , پياده سازي فرزند مورد استفاده قرار خواهد گرفت. اصولا اين عمل را در دنياي برنامه نويسي شيءگرا "چند ريختي" يا Polymorphysm مي گويند.
.GIF)
براي دريافت مثال كامل اين پست مي توانين از اين لينك استفاده كنين:
بارگزاري مثال
ادامه دارد...
همانطور كه در كد مي بينين يك متد به نام PaySalary در اين كلاس ايجاد شده كه در واقع هر ماه يكبار توسط مدير عامل شركت جهت پرداخت حقوق تمامي كارمند استفاده مي شود. صرف نظر از اينكه در موقع فراخواني واقعا چه نوع كارمندي در اين آرايه پر شده است , انتظار من اين است كه اگر كارمند ساعتي بود از روش محاسبه كارمند ساعتي و اگر كارمند حقوق بگير بود از روش محاسبه كارمند حقوق بگير حقوق افراد پرداخت شود. اين دقيقا همان نكته ايست كه در فقط در مواقعي كه شما از overridingاستفاده كنين اتفاق خواهد افتاد. به عبارت ديگر "در overriding صرف نظر از نوع ديدگاه ما (reference) به يك شيء , ماهيت آن مشخص كننده فراخواني متد پدر يا فرزند خواهد بود" يعني اگر حتي reference ما به يك شيء MonthlyEmp از نوع Emp باشد (يعني عمل upcase اعمال شده باشد) باز در مواقع فرخواني متد , پياده سازي فرزند مورد استفاده قرار خواهد گرفت. اصولا اين عمل را در دنياي برنامه نويسي شيءگرا "چند ريختي" يا Polymorphysm مي گويند.
براي دريافت مثال كامل اين پست مي توانين از اين لينك استفاده كنين:
بارگزاري مثال
ادامه دارد...
+ نوشته شده در جمعه ششم اردیبهشت ۱۳۸۷ ساعت 20:25 توسط مسعود طباطبايي | MasoudTB
|