Java Tips

طراحی و توسعه نرم افزار با زبان Java

Java Tips

طراحی و توسعه نرم افزار با زبان Java

Java Tips

اشتراک دانش و تجربه و یادگیری مستمر

وبلاگ مهندس نرم افزار

طبقه بندی موضوعی
بایگانی
نویسندگان

۷ مطلب با موضوع «OOP» ثبت شده است

تفاوت های Interface و Abstract Class :

              * یک کلاس انتزاعی(abstract Class) بعنوان یک کلاس پایه, برای یک خانواده از کلاس های مشتق شده بکار گرفته

                می شود, ولی اینترفیس(Interface) برای پیاده سازی وراثت چند گانه است.

              * یک کلاس معمولی فقط می تواند از یک کلاس Abstract ارث بری کند و لی همین کلاس می تواند از چندیدن

                  اینترفیس ارث بری کند.

              * عناصر موجود در یک کلاس Abstract می تواند مانند یک کلاس معمولی انواع سطح دسترسی داشته باشد و لی

                  عناصر اینترفیس فقط public هستند.

              * کلاس Abstract یک نوع کلاس است ولی اینترفیس یک کلاس نیست.

              * یک کلاس Abstract می تواند مانندیک کلاس معمولی Instance Variable داشته باشد ولی اینترفیس نمی تواند

                 داشته باشد .

              * وقتی در پروژه های بزرگ با تغییرات زیادی مواجه هستیم باید از کلاس Abstract استفاده کنیم, زیرا با

                  تغییر در کلاس پایه(Abstract) (بعنوان مثال متدی به کلاس پایه(Super Class) اضافه شود), کلاس های

                  مشتق شده(فرزند)  مجبور نیستند آنرا پیاده سازی کنند و اجباری نیست در حالیکه پیاده سازی تمامی متد های

                  تعریف شده داخل اینترفیس برای کلاس های مشتق شده اجباری است.

              * زمانیکه بخواهیم تمامی متد های تعریف شده در کلاس پایه بطور کامل در کلاس های مشتق شده پیاده سازی شود

                  باید از اینترفیس استفاده کنیم .

              * زمانیکه یک کلاس باید یک اینترفیس را پیاده سازی کند به این معنی است که : این کلاس باید همه بخش های

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

                  است.

              * در صورتی که نخواهیم کلیه متد های تعریف شده داخل کلاس پایه , در کلاس های مشتق شده پیاده سازی شود

                  باید از کلاس Abstract استفاده کنیم.

              * زمانیکه وراثت چندگانه داریم از اینترفیس استفاده می کنیم.

              * متد های یک اینترفیس Abstract هستند ولی یک کلاس Abstract می تواند متد غیر abstract هم داشته باشد.

              * وقتی شما یک متد به کلاس Abstract اضافه می کنید , اگر این متد Abstract نباشد بطور خودکار به همه زیرکلاس

                  ها اعمال می شود ولی اگر به اینترفیس متدی اضافه کنیم باید آنرا در تمام کلاس های مشتق شده اضافه کنیم .

              * به بیان کلی و ساده : Interface چارچوب و قالب کلی و قابلیت های یک کلاس را مشخص می کند و یک قراداد است,

                  درحالیکه Abstract نوع کلاس را مشخص می کند.

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۵۱
مهندس نرم افزار

Interface : قراردادی است برای یک سرویس گیرنده(برنامه نویس client) , که نحوه رفتار یک کلاس را تضمین خواهد کرد. Interface یک مجموعه از متد های Abstract می باشد. کلاسی که یک Interface را پیاده سازی می کند(Implement) در حقیقت متد های Abstract آن Interface را ارث بری کرده است. یک Interface یک کلاس نیست ولی شبیه به یک کلاس است. دوتفاوت اصلی بین اینترفیس و کلاس وجود دارد: 1. یک کلاس صفت ها(Attribute)(همان state و فیلد) و رفتارهای(Behavior) یک شی را توصیف می کند.  2. یک اینترفیس شامل رفتار هایی(متدها) می شود که یک کلاس باید پیاده سازی کند.

یک اینترفیس صرفا اعضایی را که باید توسط یک کلاس پیاده سازی شوند را تعریف می کند و شامل هیچ گونه پیاده سازی نیست. اینترفیس برای یک کلاس انتزاعی, جهت ایجاد قراردادهایی مابین این کلاس انتزاعی و سرویس گیرنده هایش(فرزند های این کلاس) , یک چاره پیشنهاد می کند.

شباهت های یک اینترفیس و یک کلاس:

  1.       یک اینترفیس می تواند شامل متد هم باشد.
  2.       یک اینترفیس در یک فایل .java*  نوشته می شود.
  3.       Bytecode اینترفیس در یک کلاس .java*  قرار می گیرد.
  4.       اینترفیس در یک Package قرار می گیرد.

تفاوت های یک اینترفیس و یک کلاس :

  1.       اینترفیس قابل نمونه سازی(Instantiate) نیست.
  2.       اینترفیس سازنده(Constructor) نمی تواند داشته باشد.
  3.       همه متد ها در اینترفیس, فقط باید Abstract باشند.
  4.       اینترفیس نمی تواند شامل Instance Field(Variable) باشد. فقط می تواند فیلدی را شامل شود که بصورت Static و final اعلان شده باشد.
  5.       یک اینترفیس نمی تواند از یک کلاس ارث بری کند(یک کلاس یک اینترفیس را پیاده سازی می کند).
  6.       یک اینترفیس می تواند چند اینترفیس را توسعه و بسط (extend)دهد(از چند اینترفیس ارث بری کند).

 نحو کلی اینترفیس : 

مثال تعریف یک اینترفیس : 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۴۹
مهندس نرم افزار

انتزاع یعنی: بخشی از موجودیت یک مفهوم را که , میان همه وارثان مشترک است را پیش تعریف کنیم. این توانایی منجر به داشتن نگاه مشابه به موجودیت های مشابه گردد. به عنوان مثال برای شیء ای مانند حیوان یا پرنده نمی توان صفتی همچون " دست های دو انگشتی, بال های کوتاه یا بلند, تعداد پا ها, نوع دندان و ... " تعریف کرد. زیرا موجودیت حیوان و پرنده یک موجودیت انتزاعی است.  

در دانش رایانه و مهندسی نرم‌افزار به معنای تفکیک مباحث مربوط به هم و نگریستن به موضوع, جدای از مباحث وابسته به آن است. مزیت این کار در مهندسی نرم‌افزار کمک به مدیریت پیچیدگی و پیشگیری از چفت شدگی و  وابستگی شدید (Tight Coupling) اجزای سیستم به یکدیگر است که باید در سامانه‌های نرم‌افزاری تا حد امکان از آن کاست(پیاده سازی Decoupling).

نکته : از روی کلاس های Abstract نمی توان شیء(نمونه) ایجاد کرد, در واقع قابل نمونه سازی(Instantiate) نیست. از شیء حیوان و پرنده نمی توان نمونه ساخت و فقط یک نمونه می تواند وجود داشته باشد, زیرا این(کلاس Abstract) تنها نمونه موجود است . این نمونه ها بسیار مهم هستند , زیرا این نمونه ها هستند که ساختار یک سلسله مراتب را تشکیل می دهند و صفات و رفتار های کل آن را معین می کنند.

* کلاسی که Abstract نباشد, کلاس Concrete است. کلاس Concrete(کلاس فرزند) یعنی کلاسی که

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۴۰
مهندس نرم افزار

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

تنها راه دسترسی به یک شیء فقط ار طریق یک Reference Variable(متغیر از نوع ارجاع) می باشد.Reference Variable فقط از یک نوع(Type) می تواند باشد. نوع آن یکبار اعلان می شود و بعد از آن دیگر قابل تغییر نیست.

یک نمونه پر کاربرد از چند ریختی زمانی رخ می دهد که یک ارجاع به کلاس پایه استفاده می شود برای اشاره به شیء کلاس فرزند. همه اشیاء در جاوا چند ریختی هستند زیرا از کلاس Object ارث بری می کنند.

مثال زیر را در نظر بگیرید :

کلاس Deer بصورت چند ریختی می باشد زیرا ارث بری چندگانه دارد. در این باره موارد زیر صدق می کند :

  • ·        A Deer IS-A Animal
  • ·        A Deer IS-A Vegetarian
  • ·        A Deer IS-A Deer
  • ·        A Deer IS-A Object

وقتی که ما یک متغیر از نوع ارجاع(Reference Variable) از کلاس Deer اجاد می کنیم موارد زیر صادق می باشد:

همه Reference Variable های بالا(d,a,v,o), به یک شیء از کلاس Deer در heap اشاره می کنند.

نتیجه گیری :

              * یک Reference Variable می تواند به یک شیء دیگر انتساب داده شود(به شرط اینکه final نباشد).

              * نوع Reference Type تعیین می کند که چه متد هایی با  یک شیء قابل فراخوانی(Invoke) هستند.

              * یک Reference variable می تواند اشاره کند به یک شیء  دیگر به شرط اینکه همنوع خودش باشد.

              * یک Reference variable می تواند اعلان شود مانند نوع کلاس یا یک نوع Interface. 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۲۷
مهندس نرم افزار

اگر یک کلاس از یک Super Class مشتق شود, آن کلاس می تواند متدهای کلاس پایه را بازنویسی(Override) کند(به شرط اینکه آن متد final نباشد).

مزیتی که به همراه , Override کردن متدهای کلاس پایه در Sub Class می باشد این است که : Sub Class می تواند متدهای کلاس پایه را براساس نیازمندی های خودش پیاده کند.

مثال اول:

 

خروجی آن :

مثال دوم :

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۲۱
مهندس نرم افزار

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

اگر از وراثت استفاده شود, نگهداری کد ها و اطلاعات در ساختارهای سلسله مراتبی قابل مدیریت می شود. زمانیکه ما از وراثت صحبت می کنیم از کلمات کلیدی extends و implements استفاده می کنیم. این دو کلمه تعیین می کنند که آیا یک Object از یک نوع Object دیگر است یا خیر(is-a type of another) ؟

در حقیقت این دو کلمه می گویند : این شیء یا کلاس , یک نوع از شیء یا کلاس دیگر است.

 

به عبارت دیگر : وراثت یک فرم استفاده مجدد از

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۱۲
مهندس نرم افزار

کپسوله سازی(مخفی سازی یا لفافه بندی) به این مفهوم اشاره دارد که باید بعضی از خصوصیات و رفتارهای شیء از دید دیگر اشیاء پنهان بماند. مانند: کارکرد اجزا مختلف یک خودرو(عملکرد سیستم فرمان, عملکرد سیستم برقی, عملکرد سیستم ترمز و ...).

در حقیقت کپسوله سازی باعث می شود اشیاء بدون آنکه از چگونگی کارکرد یکدیگر اطلاع داشته باشند با هم کار کنند.

بنابراین کپسوله سازی تکنیکی است که می توان یک فیلد(همان Instance Variable) کلاس را خصوصی(Private) کرد و دسترسی به آن را از طریق یک متد عمومی(Public) فراهم کرد.

مثال : 

۰ نظر موافقین ۰ مخالفین ۰ ۲۰ اسفند ۹۵ ، ۲۰:۰۱
مهندس نرم افزار