در آموزش قبل نحوۀ ساخت آبجکت از روی کلاس را آموختیم و دیدیم که چگونه میتوان به متدهای کلاس مد نظر دسترسی پیدا کرده و آنها را فراخوانی کرد. حال در این آموزش مفهوم Inheritance یا «وراثت» در زبان برنامهنویسی جاوا را مورد بررسی قرار خواهیم داد.
برخی مواقع در فرآیند توسعۀ نرمافزار چندین آبجکت از روی کلاسهای مختلفی میسازیم که کلاسهای مذکور دارای یکسری خصوصیت مشابه باشند اما این در حالی است که تعریف چندین کلاس با خصوصیات یکسان منجر بدین میشود تا در صورت نیاز به اِعمال تغییر در برخی خصوصیات کلاس مد نظر، مجبور به بازنویسی کلیۀ کلاسها باشیم که در چنین شرایطی سبک برنامهنویسی شیئگرا (OOP) میتواند مشکلات فوقالذکر را رفع نماید بدین صورت که استفاده از آن در برنامهنویسی موجب میشود تا در صورت نیاز به اِعمال تغییر بتوان تغییرات مد نظر را صرفاً در کلاس مربوطه و روی خصوصیات مورد نظر اِعمال نمود.
به طور کلی، ارثبری بدین مفهوم اشاره دارد که کلاسی تعریف کنیم تا کلیۀ ویژگیها و یا برخی از ویژگیهای یک کلاس دیگر را داشته باشد. همچنین از مفهوم وراثت میتوانیم جهت تعریف کلاسی استفاده کنیم که از یکسو تمامی ویژگیهای کلاسی دیگر را داشته و از سوی دیگر برخی ویژگیهای مورد نظر از کلاس اصلی را در آن تغییر دهیم که در ادامۀ آموزشها با نحوۀ انجام این کار نیز آشنا خواهیم شد.
به علاوه، مفهوم دیگری تحت عنوان وراثت سلسله مراتبی نیز داریم که در ادامه با ذکر مثالی به توضیح آن میپردازیم. برای مثال، شرایطی را در نظر میگیریم که سه شیئ داریم به طوری که شیئ شمارۀ دو از شیئ شمارۀ یک و همچنین شیئ شمارۀ سه از شیئ شماره دو ارثبری میکند که در چنین شرایطی شیئ شمارۀ سه از ویژگیهای شیئ شمارۀ دو برخوردار بوده و به دلیل ارثبری شیئ شمارۀ دو از شیئ شمارۀ یک، شیئ سوم ویژگیهای شیئ شمارۀ یک را هم خواهد داشت.
در واقع، در مثال فوق شیئ شمارۀ یک به عنوان Superclass یا «کلاس اصلی» و اشیاء شمارۀ دو و سه نیز به عنوان Subclass یا «کلاس زیرشاخه» تلقی میشوند و جالب است بدانیم که در مثال فوق شیئ شمارۀ دو از یکسو برای شیئ شمارۀ یک به عنوان یک Subclass محسوب میشود و از سوی دیگر برای شیئ شمارۀ سه به عنوان یک Superclass به حساب میآید که چنین رابطهای در تصویر زیر به خوبی قابلمشاهده است:
حال برای آن که درک بهتری از مفهوم وارثت در زبان برنامهنویسی جاوا داشته باشیم، مثالی از دنیای واقعی میزنیم. برای مثال، پدربزرگ خود را در نظر بگیریم که مثلاً دارای یکسری خصوصیات به صورت زیر است:
پدربزرگ ردیف عنوان مقدار 1 قد کوتاه 2 رنگ پوست روشن 3 مقدار طاسی طاس 4 خلقوخو عصبانی 5 خلاقیت بسیارخلاق 6 فعالیت فعال 7 ملیت ایرانی
همچنین برخی از این خصوصیات در ژن ایشان غالب بوده و به فرزندانشان از جمله پدر نیز انتقال یافته است به طوری که از جمله خصوصیاتی که پدر از وی به ارث برده میتوان به موارد زیر اشاره کرد:
پدر ردیف عنوان مقدار 1 قد کوتاه 2 رنگ پوست روشن 3 مقدار طاسی طاس 4 خلقوخو عصبانی خوشاخلاق 5 خلاقیت بسیار خلاق 6 فعالیت فعال 7 ملیت ایرانی 8 سواد لیسانس 9 سطح مطالعه زیاد
همانطور که در جدول فوق مشاهده میکنیم، پدر آیتم چهارم را از پدربزرگ به ارث نبرده است. به عبارت دیگر، ایشان خصوصیت عصبانیت را از پدرش به ارث نبرده و فردی خوشاخلاق است. از سوی دیگر، در مورد آیتم پنجم هم خلاقیت پدر به اندازۀ پدربزرگ نمیباشد به طوری که پدر در مقایسه با پدربزرگ از خلاقیت کمتری برخوردار است که این موضوع در برنامهنویسی تحت عنوان Override یا «رونویسی» شناخته میشود.
به عبارت سادهتر، زمانی که میخواهیم تا یک Subclass یا «کلاس زیرشاخه» تعدادی از ویژگیهای Superclass یا «کلاس اصلی» را به ارث نبرد، میتوانيم ویژگیهای مد نظر را به اصطلاح Override کنیم. به علاوه، به خاطر داشته باشیم در شرایطی که یکسری ویژگی هم در Superclass و هم در Subclass موجود باشند، کامپایلر ویژگی موجود در Subclass را مد نظر قرار داده و برنامه را بر اساس آنها اجرا میكند.
به خاطر داشته باشید |
برای Override کردن خصوصیات یک کلاس نمیتوانیم اصطلاحاً Modifier متد یا سطح دسترسی تعریفشده برای آن همچون سطوح دسترسی private ،protected و public یا تعداد و نوع پارامترهای ورودی آنها را تغییر دهیم.. |
علاوه بر خصوصیاتی که پدر آنها را از پدربزرگ به ارث میبرد، برخی از ویژگیهایی را میتوان نام برد که از پدربزرگ به ارث نبرده و خود دارای این ویژگیها میباشد. برای مثال، دو خصیصۀ دیگر همچون موارد هشتم و نهم را میتوان به جدول فوق اضافه کرد که به طور خاص برای پدر بوده و آنها را از پدربزرگ به ارث نبرده است. در واقع، میزان سواد ایشان در سطح لیسانس بوده و از سطح مطالعۀ بالایی نیز برخوردار میباشد. اکنون در جدول زیر برخی از خصوصیاتی را نام میبریم که پسر از پدرِ خود به ارث برده است:
پسر ردیف عنوان مقدار 1 قد کوتاه بلند 2 رنگ پوست روشن 3 مقدار طاسی طاس 4 خلقوخو عصبانی خوشاخلاق 5 خلاقیت بسیار خلاق 6 فعالیت فعال 7 ملیت ایرانی 8 سواد لیسانس فوق لیسانس 9 سطح مطالعه زیاد خیلی زیاد
همانطور که در جدول فوق مشاهده میکنیم، پسر در مورد اول بر خلاف پدر و پدربزرگش قدبلند است و در مورد سوم نیز بر خلاف پدر و پدربزرگش طاس نیست. همچنین پسر در مورد چهارم بر خلاف پدرش فردی عصبانی بوده و این خصوصیت را از پدربزرگ خود به ارث برده است و در مورد هشتم نیز پسر بر خلاف پدرش، تحصیلات فوق لیسانس دارد. به علاوه، در مورد نهم سطح مطالعۀ پسر در مقایسه با پدر خیلی زیاد میباشد. اکنون به منظور درک بهتر این روابط، تصویر زیر را مد نظر قرار میدهیم:
همانطور که در تصویر فوق میبینیم، پدربزرگ با رنگ قرمز، پدر با رنگ سبز و پسر با رنگ آبی مشخص شدهاند و در مستطیل مشکی رنگ، خصوصیاتی را میبینیم که بین هر سه نسل مشترک میباشند و در بالای سر هر فرد نیز خصوصیات منحصربهفرد او را مشخص کردهایم. با توجه به آنچه که در این آموزش آموختیم، در آموزش بعد قصد داریم تا به منظور درک بهتر مفهوم وراثت در زبان برنامهنویسی جاوا، از خصوصیات مابین پدربزرگ، پدر و پسر استفاده کرده و بر اساس این خصوصیات پروژهای جدید پیادهسازی نماییم.