ارث بری در جاوا چیست؟ – توضیح به زبان ساده
در قلمرو برنامه نویسی شی گرا، وراثت یک مفهوم اساسی است که به توسعه دهندگان امکان میدهد تا کلاسهای جدیدی را بر مبنای کلاسهای فعلی ایجاد کنند. در بین تمام زبانهای برنامه نویسی که از مفهوم وراثت پشتیبانی میکنند، جاوا به دلیل رویکرد قدرتمند و همهکارهاش نسبت به این ویژگی از سایر زبانها متمایز است. جاوا با کپسوله کردن فیلدها و متدها از یک کلاس والد به یک کلاس فرزند توسعه سیستمهای نرمافزاری پیچیده را تسهیل میکند. بر همین اساس در مطلب پیشِرو از مجله فرادرس به بررسی مفهوم ارث بری در جاوا پرداختهایم.
با مطالعه این مطلب ضمن آشنایی با نحوه ارث بری در جاوا با مفاهیم کلیدی این حوزه نظیر کلاس والد، کلاس فرزند، بازنویسی متد در جاوا، انواع وراثت در جاوا و بسیاری از موارد دیگر آشنا خواهید شد. همچنین، در این مطلب سعی شده است تا مثالهای مختلفی برای کمک به درک بهتر مفهوم وراثت در جاوا ارائه شود.
ارث بری در جاوا چیست؟
«وراثت» (Inheritance) یکی از ستونهای اصلی در برنامه نویسی شی گرا است. ارث بری در جاوا به توسعه دهندگان امکان میدهد تا کلاس جدیدی را بر مبنای کلاس موجود ایجاد کنند. برای یادگیری مبانی برنامه نویسی شی گرا در جاوا میتوانید فیلم آموزش رایگان برنامه نویسی شی گرا در جاوا فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
وراثت در برنامه نویسی مشابه ارث بری فرزندان از والدین در دنیای واقعی است. فرزندان از والدین خود خصوصیاتی همچون رنگ مو، قد، حالت چهره، ضریب هوشی و سایر موارد را به ارث میبرند و همچنین خصوصیات و رفتارهای جدیدی را نیز از خود بروز میدهند. در زبان برنامه نویسی جاوا نیز یک کلاس ویژگیها و رفتارهایی را از کلاس دیگری ارث بری میکند و در عین حال نیز ویژگیهای مخصوص به خود را نیز خواهد داشت.
در زبان جاوا کلاس جدید ایجاد شده تحت عنوان «کلاس فرزند یا مشتق شده» (child or derived class) و کلاس موجود که از آن ارث بری شده با نام «کلاس والد یا پایه» (parent or base class) شناخته میشود.
سینتکس ارث بری در جاوا
در زبان جاوا با استفاده از کلمه کلیدیextends میتوان وراثت در جاوا را پیادهسازی کرد. قطعه کد زیر نحوه ارث بری کلاسها در جاوا را نشان میدهد.
1class Animal {
2 // methods and fields
3}
4
5// use of extends keyword
6// to perform inheritance
7class Dog extends Animal {
8
9 // methods and fields of Animal
10 // methods and fields of Dog
11}
در مثال بالا کلاسDog با کلمه کلیدیextends از کلاسAnimal مشتق شده است. بنابراین، کلاسDog به تمام فیلدها و متدهای کلاسAnimal دسترسی خواهد داشت. در این مثال کلاسDog به عنوان کلاس فرزند و کلاسAnimal به عنوان کلاس والد یا پایه خواهد بود.
چرا به ارث بری در جاوا نیاز داریم؟
برای درک بهتر اهمیت ارث بری در جاوا مثال زیر را در نظر بگیرید. یک شرکت خودروسازی را تصور کنید که چندین مدل خودرو را به مشتریان خود ارائه میدهد. هر چند مدلهای مختلف خودرو ممکن است که ویژگیهای خاصی مثل شیشه ضد گلوله یا سانروف داشته باشند، اما تمامی آنها در ویژگیهایی همچون موتور و چرخها مشترک هستند. در این حالت ساخت یک طرح اولیه و گسترش آن برای ایجاد مدلهای مختلف منطقیتر به نظر میرسد تا اینکه هر مدل ماشین به صورت جداگانه از ابتدا طراحی شود.
به گونهای مشابه با استفاده از مفهوم ارث بری در جاوا میتوان یک کلاس با فیلدها و متدهای پایه ایجاد کرد. سپس، با توجه به نیاز پروژه کلاسهای جدیدی را از این کلاس ارث بری کرد. علاوه بر کلاسها امکان ارث بری اینترفیسها در جاوا نیز وجود دارد. پیشتر در مطلب زیر از مجله فرادرس مفهوم اینترفیس در جاوا به طور کامل همراه با پیادهسازی توضیح داده شده است.
قطعه کد زیر کلاسCar در جاوا را نشان میدهد.
1public class Car {
2 int wheels;
3 String model;
4 void start() {
5 // Check essential parts
6 }
7}
در ادامه کلاسArmoredCar با استفاده از کلمه کلیدیextends از این کلاس مشتق شده است. قطعه کد زیر نحوه ارث بری این دو کلاس را نشان میدهد.
1public class ArmoredCar extends Car {
2 int bulletProofWindows;
3 void remoteStartCar() {
4 // this vehicle can be started by using a remote control
5 }
6}
در این مثال کلاسArmoredCar تمام ویژگیها و متدهای کلاس پایهCar را دارد. همچنین، ویژگیbulletProofWindows و متدremoteStartCar() را اضافه کرده است.
مثالی از ارث بری در جاوا
بعد از آشنایی با مفهوم وراثت در جاوا و اهمیت آن در این بخش مثالی عملی از نحوه ارث بری و پیادهسازی آن در قالب کد آورده شده است.
1class Animal {
2
3 // field and method of the parent class
4 String name;
5 public void eat() {
6 System.out.println("I can eat");
7 }
8}
9
10// inherit from Animal
11class Dog extends Animal {
12
13 // new method in subclass
14 public void display() {
15 System.out.println("My name is " + name);
16 }
17}
در قطعه کد بالا کلاسAnimal به عنوان کلاس پایه مشخص شده است که دارای یک فیلد با نامname و یک متد با نامeat() است. سپس، کلاسDog با کلمه کلیدی extends از این کلاس مشتق شده است. کلاسDog تنها یک متد جدید با نامdisplay() را به کلاس پایه اضافه کرده است. در قطعه کد زیر نحوه ایجاد شی جدید از کلاسDog و دسترسی به متدهای آن نشان داده شده است.
1class Main {
2 public static void main(String[] args) {
3
4 // create an object of the subclass
5 Dog labrador = new Dog();
6
7 // access field of superclass
8 labrador.name = "Rohu";
9 labrador.display();
10
11 // call method of superclass
12 // using object of subclass
13 labrador.eat();
14
15 }
16}
در مثال بالا شیlabrador با استفاده از کلمه کلیدی new از کلاسDog ایجاد شده است. این شی به طور کامل به متدها و فیلدهای کلاس والد دسترسی دارد. به عنوان مثال، فیلدname و متدeat مربوط به کلاسAnimal هستند که در اینجا توسط شی ساخته شده از کلاسDog قابل دسترسی هستند. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
My name is Rohu I can eat
تصویر زیر ارث بری کلاسDog وAnimal مربوط به مثال بالا را به شکل سادهتری نشان میدهد.
یادگیری ارث بری در جاوا با فرادرس
برای شروع، ابتدا باید مفهوم ارث بری در جاوا را درک کنید. وراثت در جاوا به توسعه دهندگان اجازه میدهد تا با استفاده از کلاسهای موجود کلاسهای جدیدی را ایجاد کنند. پس از درک مفهوم، باید با مفاهیم پایه برنامه نویسی شی گرا در جاوا نظیر ایجاد شی، کلاس و سطوح دسترسی بیشتر آشنا شوید. بعد از آشنایی با این مفاهیم ضروری است تا انواع ارث بری در جاوا و دلیل استفاده از هر کدام را بشناسید. پس از یادگیری این مفاهیم اولیه میتوانید کلاسهایی را در جاوا بسازید و با استفاده از وراثت کلاسهای جدیدی را از این کلاسها مشتق کنید.
برای شروع مسیر یادگیری پیشنهاد میشود که فیلم آموزش رایگان جاوا فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
علاوه بر این، اگر قصد دارید زبان برنامه نویسی جاوا را به طور کامل همراه با مثالها و تمرینات مختلف یاد بگیرید، پیشنهاد میشود فیلم آموزش برنامه نویسی جاوا فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
بازنویسی متد در جاوا
گاهی اوقات در زبانهای برنامه نویسی شی گرا کلاسهای والد و فرزند ممکن است متدهایی با نام یکسان داشته باشند. در واقع، هر گاه متدی از کلاس فرزند نام یکسان، پارامترها و نوع داده برگشتی یکسان با متد موجود در کلاس والد خود داشته باشد، آنگاه در اصطلاح گفته میشود که این متد از متد کلاس والد خود بازنویسی شده است.
بازنویسی متد یا Method Overriding توسط کلاس فرزند باعث میشود تا این کلاس بتواند متدهای به ارث رسیده از کلاس والد را با توجه به نیاز خود پیادهسازی کند. برای درک بهتر مفهوم بازنویسی متد مثال زیر را در نظر بگیرید.
1class A { // parent class
2
3 String user = "root";
4
5 public void display() {
6 System.out.println("\nMy name is " + user + '\n');
7 }
8
9}
10
11class B extends A { // child class
12
13 @Override
14 public void display() {
15
16 System.out.println("\nMy name is Rahul\n");
17 }
18}
19
20class Main {
21 public static void main(String[] args) {
22
23 // create an object of the subclass
24 B obj = new B();
25 obj.display();
26
27 }
28}
در مثال بالا متدdisplay() توسط کلاسA یعنی کلاس والد پیادهسازی شده است. همچنین، کلاسB از این کلاس مشتق شده و متدی با نام یکسان یعنیdisplay() دارد. در این حالت کلاسB متدdisplay() از کلاس والد خود را بازنویسی کرده است. در نتیجه، در صورت فراخوانی این متد توسط شی نمونهسازی شده از این کلاس یعنیobj خروجی به صورت زیر خواهد بود.
My name is Rahul
در مثال بالا با توجه به بازنویسی متد توسط کلاسB متدdisplay() از کلاس والد در نظر گرفته نشده است. خروجی کد نیز مطابق با پیادهسازی این متد در کلاس فرزند است.
کلمه کلیدی super در جاوا چیست؟
در زبان برنامه نویسی جاوا از کلمه کلیدی super به منظور اشاره به کلاس والد در کلاس فرزند استفاده میشود. از این کلمه کلیدی در کلاس فرزند به منظور دسترسی و فراخوانی متدها، توابع سازنده و متغیرهای کلاس والد استفاده میشود. در ادامه اصلیترین کاربردهای کلمه کلیدی super در جاوا آورده شده است.
- مقداردهی اولیه اعضا ارث بری شده کلاس فرزند توسط فراخوانی تابع سازنده کلاس والد از بدنه کلاس فرزند صورت میگیرد.
- دسترسی به متغیرهای کلاس والد یا متدهایی که توسط کلاس فرزند پنهان شدهاند.
- با استفاده از کلمه کلیدی super میتوان به طور صریح به اعضای کلاس والد ارجاع داده و آنها را از اعضای هم نام در کلاس فرزند متمایز کرد.
در ادامه این بخش مثالی عملی از کاربرد این کلمه کلیدی در جاوا آورده شده است.
مثال عملی از کاربرد کلمه کلیدی super در جاوا
برای درک بهتر کاربرد و موارد استفاده کلمه کلیدی super در جاوا مثال زیر ارائه شده است.
1class Vehicle {
2 int maxSpeed;
3
4 Vehicle(int maxSpeed) {
5 this.maxSpeed = maxSpeed;
6 }
7
8 void display() {
9 System.out.println("Maximum speed: " + maxSpeed);
10 }
11}
12
13class Car extends Vehicle {
14 int numSeats;
15
16 Car(int maxSpeed, int numSeats) {
17 super(maxSpeed); // Calling superclass constructor using super
18 this.numSeats = numSeats;
19 }
20
21 void display() {
22 super.display(); // Calling superclass method using super
23 System.out.println("Number of seats: " + numSeats);
24 }
25}
26
27public class Main {
28 public static void main(String[] args) {
29 Car myCar = new Car(150, 5);
30 myCar.display();
31 }
32}
در خصوص قطعه کد ارائه شده در بالا به موارد زیر میتوان اشاره کرد.
- کلاسVehicle دارای یک تابع سازنده است که فیلدmaxSpeed را دریافت میکند. همچنین، این کلاس یک متد با نامdisplay برای چاپ مقدارmaxSpeed در خروجی دارد.
- کلاسCar از کلاسVehicle مشتق شده است.
- در تابع سازنده کلاسCar عبارتsuper(maxSpeed) به منظور فراخوانی تابع سازنده کلاس والد یعنیVehicle مورد استفاده قرار میگیرد.
- در متدdisplay() از کلاسCar نیز عبارتsuper.display() به منظور فراخوانی متدdisplay از کلاس والد آورده شده است.
با توجه به مثال ارائه شده در بالا با استفاده از کلمه کلیدی super در جاوا به سادگی میتوانید از طریق کلاس فرزند به اعضای کلاس والد دسترسی داشته باشید و از آنها استفاده کنید.
دسترسی به اعضای محافظت شده از طریق وراثت
یکی دیگر از نکات بسیار مهم ارث بری در جاوا این است که فیلدها و متدهای «محافظت شده» (Protected) کلاس والد از طریق کلاس فرزند به صورت مستقیم قابل دسترسی هستند. برای آشنایی با سطوح دسترسی اعضای کلاس در جاوا میتوانید فیلم آموزش برنامه نویسی جاوا فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
قطعه کد زیر نحوه دسترسی مستقیم به فیلدها و متدهای محافظت شده کلاس والد از طریق کلاس فرزند به واسطه ارث بری در جاوا را نشان میدهد.
1class Animal {
2 protected String name;
3
4 protected void display() {
5 System.out.println("I am an animal.");
6 }
7}
8
9class Dog extends Animal {
10
11 public void getInfo() {
12 System.out.println("My name is " + name);
13 }
14}
15
16class Main {
17 public static void main(String[] args) {
18
19 // create an object of the subclass
20 Dog labrador = new Dog();
21
22 // access protected field and method
23 // using the object of subclass
24 labrador.name = "Rocky";
25 labrador.display();
26
27 labrador.getInfo();
28 }
29}
در مثال بالا کلاسAnimal یک فیلد محافظت شده به نامname و یک متد محافظت شده به نامdisplay() دارد. کلاسDog از این کلاس ارث بری میکند. در ادامه یک شی با نامlabrador از کلاسDog ایجاد شده است که به فیلدname و متدdisplay() از کلاس والد دسترسی دارد. خروجی حاصل از اجرای قطعه کد بالا به صورت زیر خواهد بود.
I am an animal. My name is Rocky
در این مثال نشان داده شد که از طریق ارث بری در جاوا به سادگی میتوان به فیلدها و متدهای محافظت شده کلاس والد از طریق کلاس فرزند دسترسی داشت.
رابطه IS-A در جاوا
در زبان جاوا ارث بری کلاسها یک رابطه از نوع IS-A را نشان میدهد. رابطه IS-A در جاوا بدین معنا است که یک کلاس، کلاس دیگری را به ارث میبرد. در واقع زمانی وراثت در جاوا موضوعیت دارد که بین دو کلاس رابطه IS-A برقرار باشد. برای درک بهتر این موضوع به مثالهای زیر توجه کنید.
- Car is a Vehicle: ماشین یک وسیله نقلیه است.
- Orange is a Fruit: پرتقال یک میوه است.
- Surgeon is a Doctor: جراح یک پزشک است.
- Dog is a Animal: سگ یک حیوان است.
در مثالهای ارائه شده در بالا کلاسCar از کلاسVehicle و کلاسOrange نیز از کلاسFruit ارث بری میکند و این موضوع در خصوص نمونههای دیگر نیز صادق است.
در ادامه چند نکته مهم در خصوص رابطه IS-A آورده شده است.
- رابطه IS-A به سادگی با استفاده از کلمه کلیدیextends حاصل میشود.
- رابطه IS-A یک رابطه یک طرفه است و تنها در یک جهت صادق است. به این معنی که میتوان گفت که پرتقال یک میوه است ولی عکس آن یعنی میوه یک پرتقال است، صادق نیست، زیرا همه میوهها پرتقال نیستند.
- رابطه IS-A وابستگی شدیدی ایجاد میکند. این مورد بدین معنا است که تغییر یک موجودیت بر موجودیت دیگر تاثیر میگذارد.
رابطه HAS-A در جاوا
هر گاه یک شی از یک کلاس عضو داده کلاسی دیگر باشد، آنگاه یک رابطه از نوع HAS-A خواهیم داشت. به عبارت دیگر رابطهای که در آن یک شی از یک کلاس به یک شی از کلاس دیگر یا نمونه دیگری از همان کلاس ارجاع داشته باشد، رابطه HAS-A نامیده میشود. برای درک بهتر این موضوع مثال زیر را در نظر بگیرید.
1public class Address {
2 // Code goes here.
3}
4public class Person {
5// Person has-a Address.
6 Address addr = new Address();
7}
8// Other codes go here.
در مثال بالا کلاسPerson یک موجودیت از نوع کلاسAddress دارد. با توجه به این مثال هر شی از کلاسPerson یک موجودیت از نوعAddress خواهد داشت. به عنوان مثالی دیگر رابطه بین Cpu و کامپیوتر را در نظر بگیرید. در واقع میتوان گفت که هر کامپیوتر یک CPU دارد. قطعه کد زیر این رابطه را نشان میدهد.
1public class CPU {
2 // Code goes here.
3}
4public class Computer {
5 // CPU part-of Computer.
6 private CPU cpu = new CPU();
7
8 // Other codes go here.
9}
در مثال بالا کلاسComputer یک موجودیت از نوع کلاسCPU دارد. بنابراین، هر شی از کلاسComputer دارای موجودیتی از نوعCPU است.
انواع وراثت در جاوا
به طور کلی ارث بری در جاوا را به ۵ دسته کلی میتوان تقسیم کرد. انواع وراثت در جاوا عبارتنداز:
- «وراثت منفرد» (Single Inheritance)
- «وراثت چندسطحی» (Multilevel Inheritance)
- «وراثت سلسله مراتبی» (Hierarchical Inheritance)
- «وراثت چندگانه» (Multiple Inheritance)
- «وراثت ترکیبی» (Single Inheritance)
در ادامه این بخش از نوشته هر کدام از انواع وراثت ذکر شده در بالا را به طور کامل مورد بررسی قرار خواهیم داد.
وراثت منفرد در جاوا
در این نوع از وراثت رابطه بین دو کلاس به شکلی است که یک کلاس از کلاس دیگر مشتق میشود. به زبان سادهتر در وراثت منفرد یک کلاس تنها از یک کلاس والد ارث بری میکند. زبان جاوا از وراثت منفرد برای اطمینان از سادگی و جلوگیری از پیچیدگیهای وراثت چندگانه پشتیبانی ارائه میدهد. تصویر زیر وراثت منفرد در جاوا را به شکلی ساده نشان میدهد.
در قطعه کد زیر نحوه وراثت منفرد در جاوا نشان داده شده است.
1class A { // parent class
2
3 public void funA() {
4 System.out.println('A');
5 }
6
7}
8
9class B extends A { // child class
10
11 public void funB() {
12 System.out.println('B');
13 }
14
15}
در مثال بالا کلاسB از کلاسA مشتق شده است که وراثت منفرد در جاوا را نشان میدهد.
وراثت چندسطحی در جاوا چیست؟
در وراثت چندسطحی یک زیر کلاس یا کلاس فرزند از یک کلاس والد مشتق میشود و سپس، همان کلاس فرزند به عنوان والد یک کلاس دیگر عمل میکند. برای درک بهتر این نوع از وراثت در جاوا ۳ کلاس با نامهایA ،B وC را در نظر بگیرید. وراثت چندسطحی بین این ۳ کلاس زمانی رخ میدهد که کلاسC فرزند کلاسB باشد و کلاسB نیز فرزند کلاسA باشد. در واقع، وراثت چندسطحی در جاوا سلسله مراتبی از کلاسها را تشکیل میدهد. تصویر زیر وراثت چندسطحی در جاوا را نشان میدهد.
قطعه کد زیر نحوه پیادهسازی وراثت چندسطحی در جاوا را نشان میدهد.
1class A { // parent class of B
2
3 public void funA() {
4 System.out.println('A');
5 }
6
7}
8
9class B extends A { // parent class of C and child class of A
10 public void funB() {
11 System.out.println('B');
12 }
13
14}
15
16class C extends B { // child class of B
17
18 public void funC() {
19 System.out.println('C');
20 }
21
22}
در مثال بالا کلاسC از کلاسB مشتق شده است و به همین شکل کلاسB از کلاسA ارث بری میکند. نکته مهم در خصوص وراثت چندسطحی این است که سطوح وراثت به عدد مشخصی محدود نمیشود. در مثال بالا سطح وراثت برابر عدد ۳ است و این سطح تا بی نهایت میتواند ادامه یابد.
وراثت سلسله مراتبی در جاوا
وراثت سلسله مراتبی در جاوا زمانی رخ میدهد که چندین کلاس از یک کلاس والد مشتق شوند. به زبان سادهتر در این نوع وراثت چندین کلاس، فرزند یک کلاس والد هستند. برای درک بهتر وراثت سلسله مراتبی در جاوا کلاسهایA ،B ،C وD را در نظر بگیرید. اگر کلاسهایB ،C وD از کلاسA مشتق شده باشند، آنگاه ارث بری سلسله مراتبی رخ خواهد داد. تصویر زیر وراثت سلسله مراتبی در جاوا را به شکلی ساده نشان میدهد.
قطعه کد زیر نیز نحوه پیادهسازی وراثت سلسله مراتبی در جاوا را نشان میدهد.
1class A { // parent class of B and C
2
3 public void funA() {
4 System.out.println('A');
5 }
6
7}
8
9class B extends A { // child class of A
10 public void funB() {
11 System.out.println('B');
12 }
13
14}
15
16class C extends A { // child class of A
17
18 public void funC() {
19 System.out.println('C');
20 }
21}
22
23class D extends A { // child class of A
24
25 public void funD() {
26 System.out.println('D');
27 }
28}
در قطعه کد ارائه شده در بالا هر ۳ کلاسB ،C وD از کلاسA مشتق شدهاند.
وراثت چندگانه در جاوا چیست؟
وراثت چندگانه زمانی رخ میدهد که یک کلاس فرزند از چند کلاس والد ارث بری کند. در واقع، وراثت چندگانه را میتوان نقطه مقابل وراثت سلسله مراتبی در نظر گرفت. تصویر زیر وراثت چندگانه بین کلاسها را به شکل بسیار سادهای نشان میدهد.
نکته مهم در خصوص وراثت چندگانه این است که زبان برنامه نویسی جاوا از این نوع وراثت پشتیبانی نمیکند. ارث بریهای متعدد در جاوا میتوانند باعث بروز خطاهای زمان اجرا شوند. به عنوان مثال، اگر قصد اجرای متدی را داشته باشیم که در هر دو کلاس والد وجود داشته باشد، آنگاه خطای زمان اجرا در برنامه رخ خواهد داد. زبان جاوا با وجود عدم پشتیبانی از وراثت چندگانه امکان ارث بری از طریق اینترفیسها را فراهم میکند. یک کلاس جاوا میتواند از چندین اینترفیس ارث بری کند. در واقع، جاوا با ارث بری چندگانه از اینترفیسها از پیچیدگیهای ناشی از وراثت چندگانه جلوگیری کرده است.
وراثت ترکیبی در جاوا
وراثت ترکیبی در جاوا همان طور که از نامش پیداست از ترکیب دو یا چند نوع وراثت حاصل میشود. به عنوان مثال میتوان وراثت چندسطحی و سلسله مراتبی را با یکدیگر ترکیب کرد. تصویر زیر یک وراثت ترکیبی را نشان میدهد.
در تصویر بالا کلاسD از کلاسهایB وC مشتق شده است و وراثت چندگانه را نشان میدهد. همچنین، کلاسهایB وC نیز از کلاسA مشتق شدهاند که نوعی وراثت سلسله مراتبی را نشان میدهد.
درک انواع ارث بری در جاوا با نمونه های واقعی
در بخش قبلی انواع مختلف ارث بری در جاوا به همراه نحوه پیادهسازی مورد بررسی قرار گرفتند. برای درک بهتر انواع مختلف وراثت در جاوا در این بخش سعی شده است تا نمونههایی از دنیای واقعی برای هر کدام از انواع وراثت بیان شود. قطعاً یادگیری مفاهیم انتزاعی برنامه نویسی از طریق مثالهای دنیای واقعی آسانتر خواهد بود. برای درک بهتر مفاهیم شی گرایی در جاوا میتوانید فیلم آموزش پروژه محور ساخت شبکه اجتماعی با جاوا فرادرس را مشاهده کنید که لینک آن در ادامه آورده شده است.
در ادامه نمونههایی قابل درک و ملموس برای هر کدام از انواع وراثت در جاوا ارائه شده است.
مثال واقعی برای وراثت منفرد در جاوا
در وراثت منفرد یک کلاس از کلاسی دیگر مشتق میشود. برای درک بهتر این نوع از وراثت ساختار سلسله مراتبی کارکنان یک شرکت را در نظر بگیرید. در این ساختار یک کلاس پایه به نام کارمند خواهید داشت و سپس انواع خاص کارمندان همچون مدیر، برنامه نویس و سایر موارد از این کلاس پایه مشتق خواهند شد. هر کدام از کارمندان ویژگیها و رفتارهای مشترک کلاس کارمند را به ارث میبرد و همزمان ویژگیها و رفتارهای خاص خود را نیز خواهد داشت. در این مثال ارث بری کلاس مدیر از کلاس کارمند نشان دهنده یک نوع وراثت منفرد خواهد بود.
مثال واقعی برای وراثت چندسطحی در جاوا
برای درک بهتر وراثت چندسطحی سیستم یک مدرسه را در نظر بگیرید. در این سیستم یک کلاس پایه به نامPerson خواهیم داشت که کلاسStudent که نشان دهنده دانش آموزان است از این کلاس مشتق شده است. همچنین، کلاس دیگری با نامHighSchoolStudent نیز که نشان دهنده دانش آموزان دبیرستانی است از کلاسStudent مشتق میشود. در هر کدام از این ارث بریها کلاسهای مشتق شده میتوانند ویژگیها و رفتارهای مخصوص به خود را اضافه کنند.
مثال واقعی برای وراثت سلسله مراتبی در جاوا
در این نوع ارث بری در جاوا چندین کلاس از یک کلاس پایه مشتق میشوند. برای درک وراثت سلسله مراتبی قلمرو حیوانات را در نظر بگیرید. در این مثال یک کلاس پایه به نامAnimal برای همه حیوانات خواهیم داشت. سپس، دستههای مختلف حیوانات همچون پستانداران، خزندگان و پرندگان در قالب کلاسهایMammal ،Reptile وBird از کلاسAnimal مشتق شدهاند. هر کدام از زیر کلاسها نشان دهنده دسته مشخصی از حیوانات هستند و در عین داشتن ویژگیهای مشترک هر کدام نیز ویژگیها و رفتارهای مخصوص به خود را نیز دارند.
مثال واقعی برای وراثت چندگانه در جاوا
در وراثت چندگانه یک کلاس فرزند میتواند از چند کلاس والد مشتق شود. همان طور که پیشتر نیز عنوان شد جاوا از وراثت چندگانه از طریق اینترفیسها پشتیبانی میکند. به عنوان مثال، یک دستگاه دستیار شخصی را در نظر بگیرید که باید هشدارها و یادآورها را مدیریت کند. در این حالت باید اینترفیسهایی با نامهایAlarm وReminder وجود داشته باشد تا کلاسDevice از این دو اینترفیس ارث بری کند.
مثال واقعی برای وراثت ترکیبی در جاوا
همان طور که در بخش قبلی عنوان شد، وراثت ترکیبی از کنار هم قرار گرفتن چند نوع وراثت تشکیل میشود. به عنوان مثال یک کارخانه تولید وسایل نقلیه را در نظر بگیرید که انواع مختلف خودروها و موتورسیکلتهای بنزینی و برقی را تولید میکند. در این مثال میتوان کلاسVehicle را به عنوان کلاس پایه در نظر گرفت که کلاسهایCar وmotorcycle به عنوان کلاس فرزند از این کلاس مشتق شدهاند. همچنین، این دو کلاس میتوانند اینترفیسهایElectric وGasoline را با توجه به نوع موتورشان پیادهسازی کنند. این ساختار یک وراثت ترکیبی را نشان میدهد.
مثالهای بررسی شده در این بخش نشان میدهند که چگونه میتوان از انواع مختلف ارث بری در جاوا برای مدلسازی روابط و تجزیه و تحلیل سیستمهای پیچیده به شیوهای ساختاریافته استفاده کرد.
مزایای ارث بری در جاوا چیست؟
استفاده از مفهوم ارث بری در جاوا مزایایی بسیاری برای توسعه دهندگان این زبان برنامه نویسی دارد. هدف اصلی وراثت در جاوا پیادهسازی مفهوم قابلیت استفاده مجدد کد، صرفهجویی در زمان و منابع و همچنین برقراری ارتباط بهتر بین کلاسهای مختلف است. در یک جمعبندی کلی مزایای استفاده از وراثت در جاوا به شرح زیر است.
- قابلیت استفاده مجدد کد
- چندریختی
- بازنویسی متد
- سازماندهی کد
- توسعه پذیری
- انتزاع
- روابط و سلسله مراتب
در ادامه این بخش هر کدام از موارد ارائه شده در بالا به طور کامل توضیح داده خواهد شد.
قابلیت استفاده مجدد کد
وراثت در جاوا به کلاسها امکان میدهد تا فیلدها و متدهای مورد نیاز خود را از کلاسهای دیگر به ارث ببرند. در نتیجه این امر امکان استفاده مجدد از کد فراهم میشود. این رویکرد برنامه نویسی ماژولار را بهبود میبخشد و افزونگی کد را نیز کاهش میدهد.
چندریختی
ارث بری در جاوا این امکان را فراهم میکند تا کلاسهای فرزند به عنوان اشیا کلاس والد خود در نظر گرفته شوند. توسعه دهندگان با استفاده از چندریختی در برنامه خود میتوانند کدهای عمومی بیشتری بنویسند و با چندین نوع شی مختلف کار کنند. بنابراین، انعطاف پذیری و توسعه پذیری کد نیز بهبود خواهد یافت. پیشتر در مطلب زیر از مجله فرادرس مفهوم چندریختی در جاوا به طور کامل همراه با مثال توضیح داده شده است.
بازنویسی متد
با استفاده از قابلیت بازنویسی متد در جاوا کلاسهای فرعی میتوانند پیادهسازی مورد نظر خود را برای متدهای به ارث رسیده از کلاس والد انجام دهند. در نتیجه با این قابلیت کلاسهای فرزند به سادگی میتوانند متدهای مورد نظر خود را سفارشیسازی کنند. این ویژگی برای پیادهسازی عملکردهای خاص در کلاسهای فرزند و در عین حال حفظ یک اینترفیس مشترک در کلاس والد مفید است.
سازماندهی کد
ارث بری در جاوا به سازماندهی بهتر کلاسها به صورت سلسله مراتبی کمک میکند. این مورد سبب میشود تا برنامه ساختاریافتهتر، درک آن آسانتر و قابلیت نگهداری آن نیز بیشتر شود.
توسعه پذیری
مفهوم وراثت در جاوا گسترش کلاسهای موجود برای افزودن قابلیتهای جدید را بدون تغییر کد اصلی تسهیل میکند. این مورد موجب سازگاری بیشتر پایگاه کد با تغییرات میشود.
انتزاع
کلاسهای والد میتوانند کلاسها یا متدهای انتزاعی را تعریف و نمونهای برای پیادهسازی کلاسهای فرزند ارائه کنند. به طور کلی وراثت انتزاع و محصورسازی دادهها و متدها را بهبود میبخشد. پیشتر در مطلب زیر از مجله فرادرس مفهوم انتزاع و کلاس انتزاعی در برنامه نویسی توضیح داده شده است.
روابط و سلسله مراتب
ارتباط کلاسها در وراثت یک نوع رابطه از نوع IS-A است که در آن کلاس فرزند یک نوع از کلاس والد خود محسوب میشود. این نوع رابطه به طراحی و درک بهتر مدل دامنه کمک میکند.
با توجه به تمام موارد عنوان شده در بالا توسعه دهندگان با استفاده از مفهوم وراثت در جاوا میتوانند سیستمهای نرمافزاری قوی و انعطافپذیری بسازند که نگهداری و گسترش آنها در طول زمان توسعه آسانتر خواهد بود.
چگونه مهارت برنامه نویسی جاوا خود را تقویت کنیم؟
بهبود مهارت برنامه نویسی جاوا با تمرین مداوم، یادگیری مفاهیم جدید و بروز ماندن با آخرین تغییرات و روندها در اکوسیستم جاوا امکان پذیر است. برای این منظور میتوان از راهکارهای مختلفی همچون انجام پروژههای کوچک، انجام چالشهای کدنویسی، خواندن کتابها و آموزشهای متنی و دیدن دورههای آموزشی استفاده کرد. در بین روشهای گفته شده یکی از بهترین راهها دیدن فیلمهای آموزش برنامه نویسی موضوعی و پروژه محور است. بر همین اساس در پلتفرم فرادرس به عنوان یکی از بزرگترین شبکههای آموزشی کشور آموزشهای متعددی در حوزه برنامه نویسی جاوا منتشر شده است.
در مجموعه آموزش جاوا فرادرس دورههای آموزشی در سطوح مختلف از مقدماتی تا پیشرفته وجود دارد که با توجه به نیاز خود میتوانید دوره مناسب خود را پیدا کنید. مجموعه آموزشهای جاوا فرادرس از طریق لینک زیر قابل دسترسی هستند.
در ادامه لینک برخی از دورههای پیشنهادی موجود در مجموعه آموزش جاوا فرادرس آورده شده است.
- فیلم آموزش پروژه محور طراحی و ساخت شبکه اجتماعی با جاوا فرادرس
- فیلم آموزش پروژه محور تولید QR Code و ایجاد و اسکن بارکد با جاوا فرادرس
- فیلم آموزش پروژه محور رایگان طراحی اپلیکیشن موزیک پلیر آنلاین فرادرس
- فیلم آموزش ساخت ربات تلگرام با جاوا فرادرس
جمعبندی
مفهوم وراثت در جاوا را میتوان سنگ بنا و پایه ساخت راهحلهای نرمافزاری مقیاس پذیر و قابل نگهداری دانست. زبان برنامه نویسی جاوا با ایجاد سلسله مراتب کلاسها و ارتقا قابلیت استفاده مجدد کد به توسعه دهندگان امکان میدهد تا برنامههای ماژولار، توسعه پذیر و ساختار یافته را طراحی کنند. استفاده از مفاهیم ارث بری در جاوا به سازماندهی و مدیریت کارآمد کد، افزایش بهرهوری و بهبود کیفیت نرمافزار منجر میشود. بر همین اساس در این مطلب از مجله فرادرس سعی شد تا مفاهیم ارث بری در جاوا به زبان ساده توضیح داده شود.
علاوه بر این انواع مختلف وراثت در جاوا به همراه مثال از دنیای واقعی مورد بررسی قرار گرفت. همچنین موارد مهمی همچون بازنویسی متد، رابطه IS-A و رابطه HAS-A در وراثت نیز توضیح داده شد. در نهایت با استفاده از اصول وراثت در جاوا خواهید توانست برنامههای کاربردی پیچیده را با توجه به نیاز خود توسعه دهید.