کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Java – وراثت/Inheritance

آموزش Java – وراثت/Inheritance

وراثت در جاوا مکانیزمی است که توسط آن آبجکتی تمامی ویژگی (property) و قابلیت ها (behavior) آبجکت پدر را کسب کرده و در اصطلاح به ارث می برد.

ایده ی پشت وراثت در جاوا این است که توسعه دهنده بتواند بر اساس کلاس های جاری، کلاس های جدید تولید نماید. زمانی که از کلاس جاری ارث بری می کنید، در واقع می توانید متدها و فیلدهای کلاس پدر را مجددا استفاده کرده و در صورت نیاز متدها و فیلدهای جدید اضافه نمایید.

وراثت نشانگر رابطه ی IS-A (IS-A relationship) هست که تحت عنوان رابطه ی پدر-فرزندی (parent-child relationship) نیز شناخته می شود.

دلایل استفاده از وراثت در Java

  1. برای بازنویسی بدنه یا پیاده سازی متد یا Method Overriding (بدین وسیله می توان چندریختی زمان اجرای برنامه/runtime polymorphism را پیاده سازی کرد).
  2. جهت استفاده مجدد و قابلیت فراخوانی کد یکسان در جاهای مختلف

دستور پیاده سازی وراثت در جاوا

class Subclass-name extends Superclass-name  
{  
   //methods and fields  
}  

کلیدواژه ی extend یک کلاس جدید ایجاد می کند که علاوه بر اعضای اختصاصی خود، فیلدها و متدهای کلاس پدر (کلاس دوم و درج شده پس از واژه ی extend) را به ارث می برد. واژه ی extend به معنای افزایش قابلیت های یک موجودیت است. در زبان Java، آن کلاسی که اعضای داخلی و محتوای آن به کلاس دیگری به ارث داده می شود، کلاس پدر یا کلاس ارشد (super/parent class) گفته می شود و آن کلاسی که از کلاس پدر ارث بری می کند، در اصطلاح کلاس فرزند یا زیرمجموعه (subclass) خوانده می شود.

مثالی از ارث بری در جاوا

آموزش Java

همان طور که در تصویر بالا مشاهده می کنید، کلاس programmer زیرمجموعه و فرزند کلاس Employee یا کلاس پدر است. رابطه ی بین دو کلاس را می توان به این صورت بیان کرد: Programmer IS-A Employee. معنی عبارت مزبور این است که کلاس programmer از جنس کلاس Employee است.

class Employee{  
 float salary=40000;  
}  
class Programmer extends Employee{  
 int bonus=10000;  
 public static void main(String args[]){  
   Programmer p=new Programmer();  
   System.out.println("Programmer salary is:"+p.salary);  
   System.out.println("Bonus of Programmer is:"+p.bonus);  
}  
}  

خروجی:

Programmer salary is:40000.0
 Bonus of programmer is:10000

در مثال بالا، آبجکت programmer می تواند علاوه بر فیلد کلاس خود به کلاس Employee دسترسی داشته باشد و این عملا یعنی قابلیت استفاده مجدد از کد یکسان در بخش های مختلف پروژه یا همان code reusability.

انواع ارث بری در Java

بر اساس واحد کلاس، در زبان Java ما می توانیم سه نوع ارث بری داشته باشیم: (تکی) single، (چندگانه) multilevel و (سلسله مراتبی) hierarchical. در برنامه نویسی جاوا ارث بری چندگانه (multiple) و ترکیبی (hybrid) تنها از طریق interface قابل پیاده سازی می باشد. در مباحث آتی درباره ی interface شرح خواهیم داد.

آموزش Java
نکته:

ارث بری چندگانه در Java از طریق کلاس صورت پذیر نیست.

زمانی که یک کلاس همزمان از چندین کلاس ارث بری دارد، در اصطلاح OOP به آن وراثت چندگانه یا multiple inheritance گویند. برای مثال:

آموزش Java

مثال کاربردی از وراثت معمولی (Single Inheritance)

فایل: TestInheritance.java

class Animal{  
void eat(){System.out.println("eating...");}  
}  
class Dog extends Animal{  
void bark(){System.out.println("barking...");}  
}  
class TestInheritance{  
public static void main(String args[]){  
Dog d=new Dog();  
d.bark();  
d.eat();  
}}  

خروجی:

barking...
eating...

مثال کاربردی از وراثت سطحی (Multilevel Inheritance)

فایل: TestInheritance2.java

class Animal{  
void eat(){System.out.println("eating...");}  
}  
class Dog extends Animal{  
void bark(){System.out.println("barking...");}  
}  
class BabyDog extends Dog{  
void weep(){System.out.println("weeping...");}  
}  
class TestInheritance2{  
public static void main(String args[]){  
BabyDog d=new BabyDog();  
d.weep();  
d.bark();  
d.eat();  
}}  

خروجی:

weeping...
barking...
eating...

مثال کاربردی از وراثت سلسله مراتبی (Hierarchical Inheritance)

فایل: TestInheritance3.java

class Animal{  
void eat(){System.out.println("eating...");}  
}  
class Dog extends Animal{  
void bark(){System.out.println("barking...");}  
}  
class Cat extends Animal{  
void meow(){System.out.println("meowing...");}  
}  
class TestInheritance3{  
public static void main(String args[]){  
Cat c=new Cat();  
c.meow();  
c.eat();  
//c.bark();//C.T.Error  
}}  

خروجی:

meowing...
eating...

چرا وراثت چندگانه (multiple inheritance) در Java قابل پیاده سازی نمی باشد؟

جهت کاستن از پیچیدگی زبان و آسان سازی هر چه بیشتر برنامه نویسی، Java از قابلیت وراثت چندگانه پشتیبانی نمی کند.

شرایطی را در نظر بگیرید که در آن A، B و C هر یک کلاس های مستقلی هستند. کلاس C از کلاس A و B ارث بری می کند. حال اگر کلاس های A و B دارای متدی یکسان باشند و توسعه دهنده آن را از آبجکت کلاس فرزند فراخوانی کند، آنگاه در خصوص فراخوانی متد کلاس A یا B ابهام پیش می آید.

از آنجایی که خطاهای زمان کامپایل از خطاهای زمان اجرا بهتر هستند، اگر از دو کلاس ارث بری نمایید (که اصلا در جاوا پشتیبانی نمی شود)، java خطاهای زمان کامپایل نمایش می دهد. خواه متدهای یکسانی در دو کلاس مزبور داشته باشید و خواه متفاوت، خطاهای زمان کامپایل تولید شده و برنامه به مرحله ی اجرا نمی رسد.

class A{  
void msg(){System.out.println("Hello");}  
}  
class B{  
void msg(){System.out.println("Welcome");}  
}  
class C extends A,B{//suppose if it were  
 Public Static void main(String args[]){  
   C obj=new C();  
   obj.msg();//Now which msg() method would be invoked?  
}  
}  

خروجی:

Compile Time Error
1396/07/02 12110 2572
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...