سناریوی زیر را در نظر بگیرید:
بازی وجود دارد که در آن انواع و اقسام اردک تعریف شده اند و اردک ها قادر به شنا کردن و کوئک کردن و دارای نمایش خاص می باشند و شی این اردک ها به این صورت تعریف شده است که یک کلاس Abstract به نام Duck تعریف شده است و کلاس های RedHeadDuck و MallardDuck از این کلاس ارث برده و متد Display کلاس پدر را Override و بازنویسی کرده اند:
چند وقتی است که رقبا با وارد کردن بازی مشابه به بازار شرکت سازنده این بازی را تحت فشار گذاشته اند و شرکت سازنده این بازی برای اینکه بتواند با بازی های مشابه رقابت کنند تصمیم به تغییر در این بازی را گرفته اند و چگونگی این تغییر را به تیم فنی بازی سپرده اند. تیم فنی پیشنهاد پرواز کردن اردک ها را مطرح می کند و قرار می شود این پیشنهاد در جلسه سهام داران مطرح شود.
در جلسه مدیر با سهامداران ، سهامداران به این نکته اشاره می کنند که این اتفاق مسخره ای می باشد که همه اردک ها پرواز کنند و فقط بعضی از آن ها باید بتوانند پرواز کنند.
خب تیم فنی برای ایجاد این تغییر چه راه حل هایی را می تواند در نظر بگیرد؟
۱-Inheritance : اولین راه کاری که به ذهن تیم فنی می آید این است که برای اردک هایی که قادر به پرواز کردن نیستند متد Fly را Override و بازنویسی کنند و عملیات و Action پرواز نکردن را برای آن ها تعریف کنند.همچنین فرض کنید اردکی هم توانایی Quack کردن هم نداشته باشد.اما این کار دارای مشکلاتی است :
۱-این کار باعث پیدا شدن کد duplicate در سیستم می شود به این صورت که اردک هایی که رفتار مشابه دارند باید جداگانه رفتار ها در سیستم تعریف شوند.
۲-ممکن است ما بخواهیم اردک ما تحت شرایطی و در Run time تصمیم گرفته شود که پرواز کند که این کار با Inheritance امکان پذیر نیست.
به دلایل بالا استفاده از Inhertiance یا ارث بری رد می شود.
قسمت دوم این مقاله را در اینجا بخوانید.
پایان قسمت اول
منبع : Head First Design Pattern