وراثت در جاوا

ناصر نادری | 1393/11/27


بنام خدا : در این سری از آموزشهای زبان جاوا ,  میخواییم مبحث شی گرایی رو بصورت اختصاصی و در چند جلسه خدمت دوستان ارائه بدیم . قبل از هرچیز باید بگم که مطالب این بخش , ترکیبی از تجربه شخصی و مثالهای وب سایتهای مرجع جاوا هست که بصورت ترجمه شده در اختیارتون قرار خواهیم داد .  

مبحث شی گرایی رو با وراثت شروع  میکنیم .

وراثت در دنیای واقعی یعنی انتقال خصوصیات رفتاری و ویژگیهای والدین به فرزندان , همراه با احتمال تغییر جهشی در ژن های منتقل شده (چی گفتم !!!)

در دنیای برنامه نویسی شی گرا , وراثت یعنی انتقال همه یا برخی از خصوصیات و متدهای یک کلاس والد به کلاس فرزند (کلاسی که از کلاس والد  اشتقاق پیدا کرده) . به عنوان مثال ما یک کلاسی داریم  با نام phone که معرف   تلفن همراه که دارای خصوصیات کلی یک تلفن همراه هست .  حالا فرض کنیم کلاس دیگه ای به نام  nokia داریم  که یک کلاس مشتق شده از کلاس phone هست . و در ضمن خودش دارای یک سری خصوصیت هست که شاید کلاس phone نداشته باشه .

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

 public class Phone{
}

public class Nokia extends Phone{
}

public class Samsung extends Phone{
}

public class SamsungGalaxy extends Samsung {
} 

نکته : در جاوا سعی کنیم نام کلاسها رو با حرف بزرگ شروع کنیم .

در مثال بالا هر دو کلاس Samsung , Nokia در واقع قبل از هرچیز یک Phone هستن . یعنی یک سری خصوصیات رو همه بصورت مشترک از کلاس Phone به ارث میبرن . ,SamsungGalaxy هم یک نوع Samsung هست .  در اصطلاح میگیم Nokia یک subclass از Phone هست وSamsung میشه superclass کلاس SamsungGalaxy.

در اینجا یک مفهوم تازه بوجود میاد به نام IS_A یا (هست یک ...)

1 - Nokia یک Phone هست .

2 - Samsung یک Phone هست.

3 - SamsungGalaxy یک Samsung هست

4 -  از  2 و 3 نتیجه منطقی بوجو میاد که SamsungGalaxy یک Phone هست .

نکته : در هنگام ارث بری یک کلاس فرزند از کلاس والد همه  متدها و خصوصیات کلاس والد به کلاس فرزند منتقل میشن به غیر از اونایی که با مدیفایر private تعریف شدن .

از کلمه کلیدی implements  زمانی استفاده میکنیم که بخواییم کلاسمون از یک interface ارث بری داشته باشه .  در مورد interface ها در همین سری شی گرایی بعدا مفصلا بحث میکنیم . فعلا همین قدر بدونید که interface نوعی تعریف شبیه کلاس هست که توش متدها تعریف میشن ولی پیاده سازی نمیشن.

مثال زیر استفاده از implements رو نشون میده .

 public interface Phone{}// این یک اینتر فیس هست 

public class Samsung implements Phone{// ارث بری از یک اینترفیس
}

public class SamsungGalaxy extends Samsung{//ارث بری از یک کلاس
} 

با  استفده از کلمه کلیدی instanceof  میتونیم بفهمیم که یک نوع آبجکت از یک نوع کلاس هست یا نه . به مثال زیر توجه کنید :

 interface Phone{}//تعریف یک اینترفیس

class Nokia implements Phone{}// تعریف یک کلاس و ارث بری از اینترفیس

public class N95 extends Nokia{// تعریف یک کلاس و ارث بری از یک کلاس دیگه
    public static void main(String args[]){

    Nokia m = new Nokia();// تعریف یک ابجکت از نوع نوکیا
    N95 d = new N95();// تعرف یک آبجکت از نوع گوشی n95

    System.out.println(m instanceof Phone);// تعیین اینکه آیا آبجکت ما یک نوع از کلاس گوشی هست یا نه
    System.out.println(d instanceof N95);
    System.out.println(d instanceof Nokia);
}
}  

نتیجه اجرای کد بالا :

 true
true
true 

میتونیم داخل یک  کلاس یک شی از نوع یک کلاس دیگه تعریف کرد .

 public class Nokia{}
public class Battery{}
public class N95  extends Nokia{
    private Battery BT;
}  

 در تعریف بالا کلاسی داریم به نام کلاس Battery که نوکیا N95 دارای  یک آبجکت از اون هست . این خودش یک اصطلاح جدید رو به نام HAS_A یا (دارای یک ... هست ) رو ایجاد میکنه . در اصطلاح میگیم نوکیا N95 دارای یک باطری هست که خود باطری یک کلاس مستقل هست.

نکته : در جاوا نمیتونیم از بیستر از یک کلاس ارث بری داشته باشیم ولی میتونیم از چند تا interface ارث بری داشته باشیم.

با استفاده از کلمه کلیدی super میتونیم خصوصیات و متد های کلاس والد رو دستکاری کنیم .

 class Phone
{
    string name;//خصوصیت مربوط به کلاس والد
}
public class Nokia extends Phone
{
    string name;//خصوصیت مربوط به کلاس فرزند با همون نام
    public void printNames()
    { 
        super.name="ParentClass";// مقدار دهی خصوصیت والد
        name= "ChildClass";// مقدار دهی خصوصیت فرزند
        System.out.print(super.name + " and " + name);// چاپ خصوصیت والد و فرزند 

    }
} 

به همین طریق میتونیم به متدهای کلاس والد هم دسترسی داشته باشیم .

تا جلسه بعد در پناه حق.


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید