ارث بری یا وراثت یا Inheritance یکی از مفاهیم بسیار مهم در مبحث شیگرایی است. مفهوم ارث بری در برنامه نویسی، دقیقا به همان معنا و مفهومی است که در دنیای واقعی برای انسانها، حیوانات و سایر اشیاء وجود دارد. تمام موجودات زنده و اشیاء، یکسری خصوصیات (ویژگی) و رفتارهایی شبیه پدران خود دارند که آنها را به ارث بردهاند. در ادامه به بررسی این مفهوم خواهیم پرداخت.
در برنامه نویسی گاهی برنامه نویسان مجبور هستند آبجکت هایی از روی کلاس های متفاوتی ایجاد کنند. در همین حین، ممکن است برخی از کلاس ها خصوصیات شان مشابه برخی دیگر کلاس ها باشد. در چنین شرایطی، اگر برنامه نویس بخواهد تک تک این کلاس ها را ایجاد کند و خصوصیات یکسان شان را نیز برای هر کدام تعریف کند، اگر در حین نوشتن پروژه بخواهد تا تغییری در برخی خصوصیات آن ها اعمال کند، مجبور است تا کلیه کلاس ها را بازنویسی کند و در همین جا است که یکی از بهترین ویژگی های زبان برنامه نویسی جاوا که یک زبان برنامه نویسی شئ گرا است را می تواند مورد استفاده قرار داده تا دیگر مجبور نباشد در صورت بروز یک تغییر، کلیه ی خصوصیات کلاس های ایجاد شده را بازنویسی کند ، “ارث بری” (Inheritance) نام دارد.
به طور خلاصه، اگر برنامه نویس بخواهد یک شیء ایجاد کند که تمامی و یا برخی از ویژگی های یک شیء دیگر را داشته باشد می تواند از قابلیت ارث بری در زبان برنامه نویسی جاوا استفاده کند. در ضمن اگر برنامه نویس بخواهد تا یک شیء کلیه ی ویژگی های شیء دیگری را به ارث برد به جز یک ویژگی که می بایست تغییر کند، این کار باز هم از طریق وراثت امکان پذیر است که در ادامه ی آموزش ها با نحوه ی انجام این کار نیز آشنا خواهیم شد.
از سوی دیگر وراثت سلسله مراتبی نیز امکان پذیر است. فرض کنیم که ما سه شیء داریم به طوری که شیء شماره دو از شیء شماره یک ارث بری می کند و شیء شماره سه از شیء شماره دو. در واقع شیء شماره سه نه تنها از ویژگی های شیء شماره دو برخوردار خواهد بود، بلکه از آنجا که شیء شماره دو از شیء شماره یک ارث بری می کند، شیء شماره سه ویژگی های شیء شماره یک را نیز در بر خواهد داشت.
بعنوان مثال در محیط دانشگاه، از آنجا که موجودیت های دانشجو و کارمند در بعضی خصوصیات مشترک هستند، می توان کلاس پایه شخص (Person) را تعریف کرد که کلاس های دانشجو(Student ) و کارمند (Personal) از آن ارث بری داشته باشند. در ادامه می توان دو کلاس برای دانشجویان روزانه و دانشجویان شبانه تعریف کرد که از کلاس پایه دانشجو ارث بری داشته باشند.
با کمی تامل متوجه می شوید که در هر محیطی سلسله مراتبی از کلاس ها وجود دارد که هر کدام از کلاس بالاتر ارث بری دارند. قاعده کلی تعریف و پیاده سازی خصوصیات و رفتار مشترک، یکبار برای کلاس پایه(Base) و پرهیز از تکرار آن برای کلاس ها مشتق شده (Drived) است.
در بحث ارث بری به کلاس اصلی می گویند:
- کلاس پایه (Base Class)
- اَبَر کلاس (Super Class)
- کلاس والد (Parent Class)
و به کلاس وارث می گویند:
- کلاس مشتق (Derived Class)
- زیر کلاس (Subclass)
- کلاس فرزند (Child Class)
استفاده از مفهوم ارث بری در برنامه نویسی بسیار ساده است. در آموزشهای قبلی این دورهی آموزشی، با مفاهیمی مانند کلاسها، ویژگیها (خصوصیات) و متدها (رفتارها) آشنا شدهاید. هنگامی که یک کلاسی را تعریف میکنیم، در آن کلاس ویژگیها و رفتارهایی را هم مشخص میکنیم. حالا اگر یک کلاس دیگر تعریف کنیم و بخواهیم از یک کلاس دیگری ارث بری کند، باید از کلمهی کلیدی extends استفاده کنیم. به کد زیر توجه کنید:
package com.codenevisan;
public class Person {
String name;
int age;
}
در بالا یک کلاسی ایجاد کردهایم با نام Person که این کلاس دارای ویژگیهای name و age است. حالا میخواهیم کلاس دیگری ایجاد کنیم با نام Student که از کلاس Person ارث بری کند. کد زیر:
package com.codenevisan;
public class Student extends Person {
}
همانطور که مشاهده میکنید با استفاده از کلیدواژهی extends از کلاس Person ارث بری کردهایم.
حالا برای اینکه مطمئن شویم که ما در کلاس Student به فیلدهای (ویژگیهای) کلاس Person دسترسی داریم، یک متد در کلاس Student تعریف میکنیم و سپس یکی از فیلدهای کلاس Person را در خروجی استاندارد چاپ میکنیم. کد زیر:
package com.codenevisan;
public class Student extends Person {
public void show() {
System.out.println(name);
}
}
حالا اگر خواستار اجرای برنامه هستید، در متد main یک آبجکت از روی کلاس Student ایجاد کنید و سپس متد ()show را فراخوانی کنید. البته خروجی این برنامه مقدار null است، اما برای تمرین بیشتر این کار را خودتان انجام دهید.
یکی از نکات مثبت استفاده از Code Reuse را در کد بالا میتوان مشاهده کرد. فرض کنید پیاده سازی کلاس Person بسیار مفصل است و شامل فیلدها و متدهای بسیار زیادی است. اگر بخواهیم دقیقا همین فیلدها و متدها را در کلاس Student کپی کنیم و از وراثت استفاده نکنیم، برنامه بدون هیچ مشکلی اجرا میشود، اما نکته اینجا است که اگر در آینده بخواهیم تغییراتی در کلاس Person ایجاد کنیم و یا یک باگی را پیدا کنیم و بخواهیم آن را رفع کنیم، تک تک کلاسهایی که ویژگیها و متدهای کلاس Person را کپی کردهاند، باید تغییر کنند و این کار بسیار سخت و زمانبر و کلافه کننده است. اما وقتی از وراثت استفاده میکنیم، فقط کافی است که کلاس Person را تغییر دهیم، در این صورت به صورت خودکار تمام زیر کلاسها تغییر میکنند.