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