دسته: شي گرايي

چند شکلی (Polymorphism)

چند شکلی (Polymorphism):

 

چند شکلی به طور تکنیکی بدین معنی است که یک شی(thing) قابلیت دارد که شکل های مختلف به خود بگیرد.منظور از شی در جمله بالا یک متد می باشد. و منظور از شکل، رفتاری است که توسط آن متد انجام می شود.چند شکلی یعنی اینکه یک متد می تواند دارای رفتار های مختلف باشد.

ممکن است در ابتدا مفهوم چند شکلی گیج کننده باشد. اما این سر در گمی با یک مثال از دنیا واقعی می تواند، بطور کامل از بین برود. کلید روشن و خاموش کردن کامپیوتر خود را در نظر بگیرید، زمانیکه شما بخواهید کامپیوتر خود را روشن کنید دکمه را فشار می دهید و کامپیوتر روشن می شود. زمانیکه می خواهید کامپیوتر خود را خاموش کنید، دکمه را فشار می دهید و کامپیوتر خاموش می شود.

در مثال بالا متد فشار دادن کلید در شرایط مختلف، عملیات خاصی را انجام می دهد. این یعنی چند شکلی. یک مثال دیگر را بررسی می کنیم، تصور کنید که در یک فروشگاه به کالاها تخفيف داده می شود. اما برای انواع مختلف کالاها، نخفیف به روش متقاوتی محاسبه می شود. در این حالت ما یک متد تخفیف داریم اما در پیاده سازی نسبت به نوع کالا، عملیات متفاوتی را برای محاسبه تخفیف خواهیم داشت.

چند شکلی در اغلب موارد از طریق رابطه تعمیم(Generalization) پیاده سازی می شود.تصور کنید که یک سوپر کلاس به نام کالا داریم که دارای متدی به نام تخفیف می باشد. کلاس های مواد غذایی، پوشاک،کتاب و …  را در نظر بگیرید.این کلاس ها،زیر کلاس، کلاس کالا می باشند. که صفات و متد های آن را به ارث برده اند.اما نحوه محاسبه تخفیف در کلاس های مختلف با همدیگر متفاوت می باشد.در این حالت در هر زیر کلاس متد تخفیف نسبت به عملیاتی که باید انجام بدهد تا تخفیف را محاسبه کند باید بازنویسی شود اما با همان نام قبلی تخفیف.متد تخفیف در کلاس های مختلف معرف رفتار جداگانه ای هست اما تخت همان نام قبلی تخفیف.

رابطه تعمیم (Generalization)

رابطه تعمیم (Generalization):

 

شما زمانیکه در یک سوپر مارکت قدم می زنید. شما مواد غذایی را بر حسب ویژگهای آنها در قسمت های مختلف یک سوپر مارکت مشاهده می کنید. میوه ها و سبزیجات در یک قسمت فروشگاه، کوشت در قسمتی دیگر از فروشگاه و خشکبار را در قسمتی دیگر از فروشگاه پیدا می کنید. همه اینها مواد غذایی هستند، اما اینها انواع مختلفی از مواد غذایی هستند.عبارت های “تا حدی”(““Kind of)، “نوعی از” (““Type of) یک رابطه تعمیم را بین دو کلاس نشان میدهد.(برای مثال سیب نوعی از میوه است و میوه نیز نوعی از غذا است.) در بعضی مواقع  عبارت “هست یک” بیانگر رابطه تعمیم است.(برای مثال سیب قرمز یک سیب هست.)

این نوع رابطه اغلب، وراثت(inheritance) نامیده می شود.مثال سیب را در نظر بگیرید. سیب نوعی میوه است پس سیب تمام ویژگیهای یک میوه را به ارث می برد.همچنان سیب (specialization) از میوه است زیرا آن تمام ویژگیهای میوه را به ارث می برد و همچنین سیب بعضی از ویژگیها را دارد که فقط متعلق به سیب می باشد و سیب را از دیگر میوه ها متمایز می کند.پس می توان گفت که میوه یک تعمیم (generalization) از هندوانه، سیب، هلو و همه دیگر اشیاء است که در این گروه قرار دارند.

وراثت در سیستم های شی گرا همانند به ارث بردن مشخصات رفتاری و بدنی از والدینتان است. مشخصات رفتاری و بدنی، همان صفات و رفتارهای یک کلاس هستند که یک کلاس از کلاس دیگر می تواند به ارث ببرد.وراثت زیستی یک مدل سلسله مراتبی بوجود می آورد که شما را قادر می سازد با دنبال کردن این سلسله مراتب و بالا رفتن در آن اجداد خودتان را بشناسد. در سیستم های شی گرا نیز دقیقا به ابن صورت است که شما می توانید با دنبال کردن این رابطه، کلاس مولد کلاس جاری را بدست آورید. سیب قرمز یک سیب است. پس کلاس مو لد سیب قرمز ، کلاس سیب است. سیب نوعی میوه است. پس کلاس مولد سیب، کلاس میوه است. سیب یک زیر کلاس(sub class) است. میوه یک سوپر کلاس(super class)است.

 

سوپر کلاس: یک سوپر کلاس، کلاسی است که دارای ویژگیهای است که بین دو یا چند کلاس مشترک است و آنها را با آن کلاس ها به اشتراک گذاشته است. سیب یک سوپر کلاس برای سیب قرمز است. همه صفات و رفتارهای مشترک بین سیب قرمز و سیب، در کلاس سیب تعریف شده است و سیب قرمز از آن صفات و رفتارها استفاده می کند.

 

زیر کلاس : یک زیر کلاس، کلاسی است که دارای ویژگیهای است که منحصر به آن کلاس می باشد همراه با ویژگیهای که در یک سوپر کلاس تعریف شده است و آنها را از آن سوپر کلاس به ارث می برد. یک کلاس می تواند هم سوپر کلاس باشد و هم یک زیر کلاس. کلاس سیب یک سوپر کلاس برای کلاس سیب قرمز است و یک زیر کلاس برای کلاس میوه است.

 

کلاس انتزاعی(class abstract ) : کلاس انتزاعی، کلاسی است که نمی تواند نمونه ای داشته باشد. یک کلاس انتزاعی باید توسط یک کلاس به ارث برده شود تا از صفات و رفتارهای آن استفاده شود.

روابط (مفاهیم شی گرایی)

رابطه ها:

اشیاء برای اینکه کاری انجام بدهند نیاز دارند با هم کار کنند پس آنها نیاز به روشی دارند که با هم ارتباط برقرار کنند. وقتی که یک مشتری بلیط های را سفارش می دهد، مشتری باید یک سفارش ایجاد کند و بلیط مورد نظرش را به آن سفارش اضافه کند. اشیاء نرم افزاری که نماینده مشتری، سفارش، بلیط هستند نیاز دارند تا رابطه بین اشیاء دنیا واقعی را عینا تکرار کنند.

یک لینک(Link) رابطه بین دو شی است. یک رابطه(association) یک ارتباط بین دو کلاس هست.

رابطه بین کلاس ها (اشیاء) به سه شکل متفاوت تقسیم می شود:

  1. ارتباط (association)
  2. رابطه تجمع (aggregation)
  3. رابطه ترکیب (composition)

 

ارتباط (association) :

ساده ترین شکل رابطه، ارتباط می باشد. که یک رابطه نظیر به نظیر(peer-to-peer) بین دو شی می باشد. یک شی بطور ساده درباره شی دیگر می داند بهمان طریقی که یک فرد ممکن است فرد دیگری را بشناشد. یک ارتباط یه یک کلاس امکان می دهد تا درباره صفات و رفتارهای کلاس دیگر بداند.

یک سیستم شی گرا از انواع کلاس ها تشکیل شده است که از طریق ارسال پیام ها و دریافت پاسخها با یکدیگر همکاری دارند. هنگام اجرا، یک سیستم شی گرا، مملو از نمونه های می شوند که مطابق نوع کلاس خود می باشند. جایی که نمونه های کلاس پیام های را به نمونه های کلاس دیگر ارسال می کند یک ارتباط بین آنها بوجود آمده است.

برای مثال کلاس تحویل دار درباره صفات و رفتارهای کلاس حساب بانکی می داند و کلاس حساب درباره صفات و عملیات تحویل دار می داند. بنابراین این دو کلاس می توانند پیغامهایی را به یکدیگر ارسال کنند.

 

رابطه تجمع (aggregation):

رابطه تجمع، یک رابطه بین یک واحد کل و جزء است. در رابطه تجمع یک کلاس می تواند شامل نمونه های از کلاس های دیگر نیز باشد. برای مثال یک کلاس ماشین را در نظر بگیرید، که خود از چندین کلاس دیگر مانند یک کلاس موتور، چندین کلاس لاستیک و تعدادی کلاس دیگر برای سایر بخش ها تشکیل شده است.

در رابطه تجمع، شی جز به شی کل وابسته نیست. شی کل و جزء در زمانهای مختلف ایجاد و از بین می رود یعنی ممکن است شی جزء را ایجاد کنید بدون اینکه شی کل را یجاد کنید. برای مثال شی موتور و لاستیک را ایجاد می کنید بدون اینکه شی ماشین را ایجاد کنید. یا بر عکس ممکن است شی ماشین را با اشیاء که قبلا وجود داشته اند ایجاد کنیم بدون اینکه نیاز باشد همزمان با ایجاد ماشین، آنها را ایجاد کنیم.

برای مثال یک کلاس برای تیم پروژه در نظر بگیرید. و یک کلاس برای کارمندان شرکت در نظر بگیرید. تیم پروژه، از کارمندان شرکت تشکیل شده است. اما ممکن است یک تیم پروژه منحل شود در حالیکه کارمندان به کار خود در شرکت ادامه می دهند.

 

رابطه ترکیب (composition):

رابطه ترکیب، شبیه رابطه تجمع می باشد اما با یک تفاوت:

در رابطه ترکیب، چرخه حیات جزء نمی تواند بیش از چرخه حیات کل باشد. به عبارت دیگر شی جزء هیچ وقت نمی تواند بدون شی کل وجود داشته باشد، شی جزء همزمان با شی کل بوجود می آید و همزمان با شی کل از بین می رود.

برای مثال یک پنجره در سیستم عامل ویندوز را در نظر بگیرید، یک پنجره از چندین شی تشکیل شده است بعنوان مثال دکمه Minimize، Maximize، Close ، یک منو و …. زمانیکه یک شی پنجره ایجاد می شود همزمان با آن تمام دکمه ها و منو ایجاد می شود. با بستن پنجره تمام اشیاء، پنجره، دکمه ها و منو از بین می روند. امکان ندارد بدون وجود یک شی پنجره یک شی منو ایجاد شود و به کاربر نمایش داده شود یا با بستن و از بین رفتن شی پنجره، شی منو از بین نرود.  

رابطه ترکیب همان حذف پخش شونده (cascading deletion) است. در یک رابطه ترکیب هنگامیکه رکورد اصلی حذف می شود تمام رکورد های مرتبط با رکورد اصلی حذف می شوند.

رابطه ترکیب، مستلزم چرخه های حیات همزمان است، به طوریکه وقتی شی، کل حذف می شود، اشیاء جز نیز حذف می شود.

 

 

کلاس (مفاهیم شی گرایی)

کلاس (Class)

 

صفات و رفتارهای مربوط به شی یک کتاب را در قسمت اول مفاهیم شی گرایی بررسی کردیم، تمامی صفات و رفتارهای مربوط به این شی کتاب را دیگر کتابها نیز دارند پس شما می توانید یک مجموعه از قوانین را ایجاد کنید و برای همه کتابها نیز از آن استفاده کنید. مجموعه قوانین را کلاس می نامند. یک کلاس مجموعه ای از اشیاء است.اگر مجموعه ای از اشیاء دارای صفات و رفتارهای مشابه باشند، شما می توانید این اشیاء را در یک کلاس گروهبندی کنید.

یک کلاس یک الگو (template) است که صفات و رفتارهای یک شی واقعی را تعریف می کند. یک کلاس را همانند یک قالب شرینی با شکل حرف A در نظر بگیرید. قالب شرینی حرف A نیست اما چیزی را شبیه حرف A تعریف می کند. اگر شما یک حرف A را بخواهید ، قالب شرینی را بر روی خمیر شرینی قرار می دهید و یک حرف A بوجود می آورید ، اگر شما یک حرف A دیگر را بخواهید دوباره قالب را روی خمیر قرار می دهید و یک حرف دیگر A را بوجود می آورید و هر چند بار دیگر که بخواهید می توانید این فرایند را با همان قالب شرینی تکرار کنید.

پارگراف بالا درباره کلاس ها نیز صادق است. هنگامیکه شما یک شی را به نمایندگی از یک کلاس می خواهید ، شما یک نمونه (instance) از آن کلاس را ایجاد می کنید. یک نمونه شبیه حرف A است همانند هنگامیکه شما قالب شرینی را از روی خمیر بر می دارید.

هر نمونه شامل همان رفتارها و صفاتی است که در کلاس تعریف شده اند ، اگر چه هر نمونه یک کپی از صفات را برای خود دارد.

اشیاء انتزاعی (مفاهیم شی گرایی)

اشیاء انتزاعی (Abstract Objects) :

یک شی انتزاعی (Abstract Object) توصیفی از یک شی واقعی بدون در نظر کرفتن جزئیات آن شی است.

Abstract Object = Real Object – Details

(شی انتزاعی = شی واقعی – جزئیات)

به عنوان مثال ما برای یک شی فرد خصوصیاتی مانند نام ، نام خانوادگی ، قد و وزن را در نظر می گیریم و از بقیه صفات مربوط به آن صرفنظر می کنیم.

یک شی انتزاعی مدلی از شی واقعی است. یک شی واقعی همه صفات و رفتارهای تعریف شده یک شی انتزاعی را دارد همراه با جزئیات حذف شده از شی انتزاعی. برای مثال شی انتزاعی فرد یک مدل برای یک شخص واقعی است.شی انتزاعی می گوید که یک شخص واقعی باید یک نام ، نام خانوادگی ، قد و وزن داشته باشد. یک شخص واقعی مقادیر مرتبط با این صفات را مشخص می کند. مانند:

نام : بهروز

نام خانوادگی : بختیاری

قد : 175

وزن : 60

یک شی واقعی (Real Object) یک نمونه از شی انتزاعی است. شما می توانید بگوید که یک شخص واقعی یک نمونه از فرد انتزاعی است.

شی انتزاعی = یک مدل از شی واقعی

شی واقعی = یک نمونه از شی انتزاعی

انتزاعی کردن اشیاء واقعی :

برای مثال شما تصور کنید که می خواهید با یک فرد تماس بگیرید ، شما برای تماس با آن فرد نیاز ندارید که همه چیز را درباره او بدانید و فقط با دانستن نام و شماره تلفن طرف مقابل می توانید با او تماس بگیرید. شما می توانید نام پدر ، عادات و علایق آن قرد را بدانید و تمام اطلاعات دقیق و معتبر باشد ولی برای کاری که قرار است انجام بدهید نیاز به هیچ یک از این اطلاعات ندارید. شما برای انتزاعی کردن یک شی نیاز دارید فقط صفات و رفتارهای را از یک شی داشته باشید که برای انجام دادن کاری که قرار است انجام بدهید ضروری هستند و بقیه صفات و رفتارها را باید حذف کنید.