روی خط زندگی

گشت و گذار من در هنر نرم افزار

روی خط زندگی

گشت و گذار من در هنر نرم افزار

۳ مطلب با کلمه‌ی کلیدی «Inheritance» ثبت شده است

در بسیاری از اوقات، برنامه نویسان و توسعه دهندگان، تنها تفاوت بین Interface و abstract class را در این می دانند که یک Interface پیاده سازی ندارد ولی abstract class می تواند رفتار ها یا در واقع متد ها را پیاده سازی کند. اما این تنها تفاوت این دو نیست و به واقع این دو از نقطه نظر ماهیت با هم تفاوت دارند و نه پیاده سازی.


وقتی یک کلاس از یک Interface ارث بری می کند، در واقع به مانند آن است که یک قرارداد را امضا می کند. کلاس با ارث بری از این Interface به ما تضمین می دهد که متد های آن را من پیاده سازی خواهم کرد و این یعنی من این رفتار ها را دارم. بدین جهت است که اگر به اسم Interface ها دقت کرده باشید، عموما به able، Provider و مانند آن ختم می شوند، مانند ICloneable . حتی آن کاراکتر «I» که در ابتدای این نام می آید اذعان می کند که من می توانم! یا من فراهم می کنم!

در مستندات راهنمای مایکروسافت، برای نام گذاری Interface ها توصیه شده که از نام ها، اصطلاحات یا صفت هایی استفاده شود که بیان کننده رفتاری باشد که آن Interface به کلاس ها القا می کند.


و اما abstract class.

وقتی به یک مفهوم از دیدگاه abstraction نگاه می کنیم، نتیجه آن پیاده سازی آن مفهوم در قالب یک abstract class است. در واقع یک abstract class مفهوم مجازی یک واقعیت است. مفهومی که ممکن است در دنیای واقعی وجود مستقیم نداشته باشد ولی کلاس هایی که از آن به ارث می روند در دنیای واقعی وجود دارند. مثلا وقتی می گوییم «نمایش دهنده» یک مفهوم مبهم به ذهن متبادر می شود و نه یک تصویر مشخص. ولی در دنیای واقعی اشیایی هستند که ماهیت این مفهوم را در خود دارند، مانند تلویزیون یا مانیتور کامپیوتر. برای همین به کلاس هایی که از یک abstract class ارث بری می کنند می گوییم: concrete class یعنی کلاس های واقعی! 


در واقع اگر بخواهیم در روابط ارث بری از دیدگاه کلاس پدر به مساله نگاه کنیم، به لحاظ ماهیتی، یک interface یک مجموعه رفتار مرتبط را به اشتراک می گذارد مانند IPrintable ولی یک abstract class یک مفهوم مجازی را به ما عرضه می کند مانند Person.

و اگر بخواهیم از دیدگاه فرزندان به مساله نگاه کنیم، کلاس هایی که از یک Interface ارث بری می کنند، در واقع می گویند ما می توانیم فلان کار را انجام دهیم یا ما این رفتار را با خود به همراه داریم و کلاس هایی که از یک abstract class ارث بری می کنند به ما می گویند ما پیاده سازی واقعی یک مفهوم مجازی هستیم.

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

شاید اصلی ترین ایده در مفاهیم شی گرایی وراثت است. با وراثت می توان یک کلاس را به چندین کلاس توسعه داد بدون آنکه کلاس اصلی ما دستخوش تغییر شود. این یکی از بهترین اشکال برای Code Reuse می باشد. وقتی یک کلاس از کلاس دیگری به ارث می رود، بدون آنکه نیاز به کد نویسی باشد، کلیه رفتار ها و ویژگی های آن کلاس را به ارث می برد (البته با توجه به دسترسی های تعریف شده برای رفتار ها، تنها رفتار هایی با سطح دسترسی public و protected به ارث می روند).


در شکل زیر کلاس های Student و Employee از کلاس Person ارث بری کرده اند. به کلاس Person می گوییم Superclass و به کلاس های Student و Employee می گوییم Subclass.


یکی از مهترین فواید استفاده از وراثت آن است که با اعمال تغییرات در کلاس پدر، تمامی کلاس های فرزند که از کلاس پدر به ارث رفته اند، بدون هیچ کاری تغییرات را دریافت می کنند.

لازم به ذکر است که در برخی از زبان ها مانند ++C امکان ارث بری از چندین کلاس وجود دارد، در واقع یک کلاس فرزند می تواند چندین پدر داشته باشد!، ولی در زبان هایی مانند #C و Java هر کلاس تنها از یک کلاس می تواند ارث بری داشته باشد و امکان وراثت چندگانه وجود ندارد. لازم به ذکر است که وراثت چندگانه علی رقم آزادی عملی که به توسعه گر می دهد، مشکلاتی را ایجاد می کند (از جمله افزایش سطح پیچیدگی یا Complexity ) که بحث آن در این مقال نمی گنجد.

۰ نظر موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۳ ، ۲۰:۴۰
حسین گویا

مفاهیم برنامه نویسی شی گرا یا (Object Oriented Programming (OOP بر محور چهار ایده اصلی بنا شده است. این چهار ایده و مفهوم زیربنایی عبارتند از:

  • انتزاع یا تجرید (Abstraction)
  • چند ریختی (Polymorphism)
  • وراثت (Inheritance)
  • کپسوله سازی (Encapsulation)

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


۰ نظر موافقین ۱ مخالفین ۰ ۰۲ بهمن ۹۳ ، ۲۰:۲۱
حسین گویا