آموزش سي شارپ - قسمت سي و دوم
اينترفيس براي توارث چندگانه - Interface for Multiple Inheritance
در پاره اي از مواقع , به اين نتيجه مي رسيم که يک موجوديت در نرم افزار شما بايد از دو يا چند موجوديت ديگر به ارث برود. اما همانطور که قبلا هم اشاره کرده بودم در سي شارپ توارث چندگانه وجود ندارد پس شما نمي توانيد از چند کلاس همزمان به ارث برويد. راه حل اين سناريو ها استفاده از اينترفيس ها براي پياده سازي توارث چندگانه مي باشد. نکته اي که وجود دارد اين است که استفاده از اين روش باعث کم تر شدن کد نويسي شما نخواهد شد.
فرض بفرمائيد که در طراحي يک سيستم براي يک شرکت توليد دو موجوديت "مشتري" و "کارمند" طراحي شده اند. هر مشتري داراي اطلاعاتي نظير نام و مبلغ اعتبار و یک متد برای خرید و يک متد براي نمايش اطلاعاتش می باشد. هر کارمند نيز داراي اطلاعاتي نظير نام و حقوق و یک متد برای نمايش اطلاعاتش می باشد. حالا شما به این نتيجه رسيده ايد که يکسري از کارمندان شرکت از شرکت خريد نيز انجام مي دهند يعني در واقع مشتري هم هستند. به همين دلیل تصميم گرفته ايد که يک کلاس به نام EmpCustomer ايجاد کنيد که هم از مشتري به ارث رفته باشد و هم از کارمند.
خوب همانطور که گفتم اجراي اين سناريو با توجه به اينکه امکان به ارث رفتن از دو يا چند کلاس به طور همزمان وجود ندارد شما بايد از يک روش ديگر يعني استفاده از interface ها اقدام کنيد.
پياده سازي توارث چندگانه با استفاده از اينترفيس ها
همانطور که قبلا اشاره کرديم يک کلاس توانايي به ارث رفتن از يک کلاس و چندين اينترفيس را دارا مي باشد. براي همين منظور من دو اينترفيس به نام هاي ICustomer و IEmployee ايجاد مي کنم:

سپس دو کلاس خود يعني Employee و Customer را از اينترفيس هاي متناظرشان به ارث مي برم و پياده سازي مي کنم:


حالا کافيست کلاس سوم را از ايجاد و از هر دو اين اينترفيس ها به ارث مي بريم:

همين طور که در تصوير مي بينيد در Print به جاي عبارت Employee یا Customer عبارت EmpCustomer چاپ خواهد شد.
!! در اين روش قصد ما اصلا کمتر نوشتن کد نمي باشد بلکه فقط پياده سازي توارث چندگانه مي باشد.
!! توجه داشته باشيد که وقتي يک کلاس از دو یا چند اينترفيس به ارث مي رود که داراي اطلاعات مشترکي هستند (مثل Name و Print در اين مثال) يکبار پياده سازي آن کافي است.
حالا کلاس Company را ايجاد مي کنم و به جاي اينکه يک آرايه از جنس Customer براي مشتريان و يک آرايه از جنس Employee براي کارمندان در نظر بگيرم آرايه اي از ICustomer براي مشتريان و آرايه اي از IEmployee براي کارمندان در نظر خواهم گرفت.

همانطور که در تصوير بالا مشاهده مي کنيد يک متد براي درج مشتريان به نام AddCustomer در نظر گرفته ام و نوع ورودي آن را از جنس ICustomer در نظر گرفته ام. همين روش براي متد AddEmployee هم با IEmployee انجام داده ام. در نتيجه شما مي توانيد اشيايي از جنس Employee و EmpCustomer را در ليست کارمندان و اشيايي از جنس Customer و EmpCustomer را در ليست مشتريان قرار دهيد.
اين مثال ادامه دارد...
فرض بفرمائيد که در طراحي يک سيستم براي يک شرکت توليد دو موجوديت "مشتري" و "کارمند" طراحي شده اند. هر مشتري داراي اطلاعاتي نظير نام و مبلغ اعتبار و یک متد برای خرید و يک متد براي نمايش اطلاعاتش می باشد. هر کارمند نيز داراي اطلاعاتي نظير نام و حقوق و یک متد برای نمايش اطلاعاتش می باشد. حالا شما به این نتيجه رسيده ايد که يکسري از کارمندان شرکت از شرکت خريد نيز انجام مي دهند يعني در واقع مشتري هم هستند. به همين دلیل تصميم گرفته ايد که يک کلاس به نام EmpCustomer ايجاد کنيد که هم از مشتري به ارث رفته باشد و هم از کارمند.
خوب همانطور که گفتم اجراي اين سناريو با توجه به اينکه امکان به ارث رفتن از دو يا چند کلاس به طور همزمان وجود ندارد شما بايد از يک روش ديگر يعني استفاده از interface ها اقدام کنيد.
پياده سازي توارث چندگانه با استفاده از اينترفيس ها
همانطور که قبلا اشاره کرديم يک کلاس توانايي به ارث رفتن از يک کلاس و چندين اينترفيس را دارا مي باشد. براي همين منظور من دو اينترفيس به نام هاي ICustomer و IEmployee ايجاد مي کنم:

سپس دو کلاس خود يعني Employee و Customer را از اينترفيس هاي متناظرشان به ارث مي برم و پياده سازي مي کنم:


حالا کافيست کلاس سوم را از ايجاد و از هر دو اين اينترفيس ها به ارث مي بريم:

همين طور که در تصوير مي بينيد در Print به جاي عبارت Employee یا Customer عبارت EmpCustomer چاپ خواهد شد.
!! در اين روش قصد ما اصلا کمتر نوشتن کد نمي باشد بلکه فقط پياده سازي توارث چندگانه مي باشد.
!! توجه داشته باشيد که وقتي يک کلاس از دو یا چند اينترفيس به ارث مي رود که داراي اطلاعات مشترکي هستند (مثل Name و Print در اين مثال) يکبار پياده سازي آن کافي است.
حالا کلاس Company را ايجاد مي کنم و به جاي اينکه يک آرايه از جنس Customer براي مشتريان و يک آرايه از جنس Employee براي کارمندان در نظر بگيرم آرايه اي از ICustomer براي مشتريان و آرايه اي از IEmployee براي کارمندان در نظر خواهم گرفت.

همانطور که در تصوير بالا مشاهده مي کنيد يک متد براي درج مشتريان به نام AddCustomer در نظر گرفته ام و نوع ورودي آن را از جنس ICustomer در نظر گرفته ام. همين روش براي متد AddEmployee هم با IEmployee انجام داده ام. در نتيجه شما مي توانيد اشيايي از جنس Employee و EmpCustomer را در ليست کارمندان و اشيايي از جنس Customer و EmpCustomer را در ليست مشتريان قرار دهيد.
اين مثال ادامه دارد...
+ نوشته شده در دوشنبه هجدهم شهریور ۱۳۸۷ ساعت 10:10 توسط مسعود طباطبايي | MasoudTB
|