درخواست های ارتباط
جستجو
لیست دوستان من
صندوق پیام
همه را دیدم
  • در حال دریافت لیست پیام ها
صندوق پیام
رویدادها
همه را دیدم
  • در حال دریافت لیست رویدادها
همه رویدادهای من
تخفیف های وب سایت
همه تخفیف ها

عضویت در

کانال تلگرام

توسینسو

اطلاعات مطلب
مدرس/نویسنده
مهدی عادلی فر
امتیاز: 157218
رتبه:6
154
197
296
1572
مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم. پروفایل کاربر

آموزش برنامه نویسی جاوا قسمت سی و پنجم: معرفی و شرح چند ریختی (polymorphism)

تاریخ 35 ماه قبل
نظرات 0
بازدیدها 1522
با سلام به همه دوستان و همراهان Itpro. در این مطلب قصد داریم که در مورد چندریختی یا polymorphism صحبت کنیم. چندریختی یکی از قابلیت های شئ است که می تواند چندین فرم یا چندین شکل داشته باشد. بیشترین استفاده از چندریختی در برنامه نویسی شئ گرا زمانی است که یک شئ از کلاس پدر ایجاد کنیم ولی آن را با کلاس های فرزندان مقداردهی نماییم. هر شئ جاوا که از کلاسی ساخته شده باشد به گونه ای که آن کلاس حد اقل دو کلاس فرزند داشته باشد که با کلاس پدر رابطه IS-A داشته باشد قابلیت چندریختی را می تواند داشته باشد. در زبان جاوا همه ی اشیاء قابلیت چندریختی و یا polymorphism را دارد. دلیل این ادعا این است که همه ی کلاس های تعریف شده در جاوا از کلاس Object ارث بری کرده اند و با آن کلاس خاصیت Is-A دارند. به یاد داشته باشید که تنها راه دسترسی به یک شئ این است که یک متغیر از کلاس آن بسازیم. متغیری که ساخته می شود دارای یک نوع خاص است. به یاد داشته باشید که اگر یک متغیر را در جاوا تعریف کرده باشیم دیگر نمی توانیم نوع آن متغیر را تغییر بدهیم. اگر یک متغیر به صورت final تعریف نشده باشد می توان شیئی را که در آن ریخته شده است را تغییر داد و یک شئ دیگر را در درون آن ریخت. نوع متغیری که متغیر از آن ساخته شده است مشخص می کند که چه متدهایی را می توانیم فراخوانی کنیم. می توان هر شیئی را که از نوع متغیر است را در داخل یک متغیر ریخت همچنین می توان هر شیئی که از یک کلاس که کلاس فرزند نوع تعریف شده متغیر است را نیز داخل متغیر ریخت (یا خدا خودمم به سختی فهمیدم این جمله رو :D) یک متغیر را می توان از نوع کلاس یا اینترفیس معرفی کرد. برای مثال به کد زیر توجه نمایید.
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

با توجه به مثال بالا می توان گفت که کلاس Deer چند وراثت دارد پس می تواند چندریخت باشد. با توجه به کد بالا مفاهیم زیر درست است
  • یک Deer یک Animal است و با آن رابطه IS-A با آن دارد.
  • Deer یک Vegetarian است و با آن ارتباط IS-A دارد.
  • Deer یک Deer است و با آن ارتباط Is-A دارد.
  • Deer یک Object است و با آن ارتباط Is-A دارد.
بنابراین با توجه به کدهای بالا مفاهیم بالا را به شکل زیر در جاوا بیان می کنیم.
Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

همه ی اعمال بالا در جاوا مجاز بوده و به شئ d در برنامه اشاره می کنند. این عمل چندریختی و یا polymorphism نام دارد.

متدهای virtual


در این بخش نشان می دهیم که چگونه متدهای override شده می توانند در چندریختی تاثیر داشته باشد و چندریختی را با متدهای override شده پیاده سازی نمود و چگونه از آنها در طراحی کلاس ها استفاده کرد. ما در مطالب قبلی در مورد override کردن متد ها صحبت کرده ایم و گفته ایم که چگونه یک متد را override می کنیم. اگر متدی در کلاس پدر باشد و همان متد در کلاس فرزند override شده باشد بنابراین متدی که در کلاس پدر است به کار نمی رود و فراخوانی نمی شود مگر این که در متد کلاس فرزند از کلمه کلیدی super استفاده شود. برای مثال به کد زیر توجه کنید:
/* File name : Employee.java */
public class Employee
{
   private String name;
   private String address;
   private int number;
   public Employee(String name, String address, int number)
   {
      System.out.println("Constructing an Employee");
      this.name = name;
      this.address = address;
      this.number = number;
   }
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + this.name
       + " " + this.address);
   }
   public String toString()
   {
      return name + " " + address + " " + number;
   }
   public String getName()
   {
      return name;
   }
   public String getAddress()
   {
      return address;
   }
   public void setAddress(String newAddress)
   {
      address = newAddress;
   }
   public int getNumber()
   {
     return number;
   }
}

حال در کد زیر از کلاس Employee به شکل زیر ارث بری می کنیم.
/* File name : Salary.java */
public class Salary extends Employee
{
   private double salary; //Annual salary
   public Salary(String name, String address, int number, double
      salary)
   {
       super(name, address, number);
       setSalary(salary);
   }
   public void mailCheck()
   {
       System.out.println("Within mailCheck of Salary class ");
       System.out.println("Mailing check to " + getName()
       + " with salary " + salary);
   }
   public double getSalary()
   {
       return salary;
   }
   public void setSalary(double newSalary)
   {
       if(newSalary >= 0.0)
       {
          salary = newSalary;
       }
   }
   public double computePay()
   {
      System.out.println("Computing salary pay for " + getName());
      return salary/52;
   }
}
حال کد زیر با دقت بخوانید و سعی کنید خروجی برنامه را حدس بزنید.
/* File name : VirtualDemo.java */
public class VirtualDemo
{
   public static void main(String [] args)
   {
      Salary s = new Salary("Mohd Mohtashim", "Ambehta, UP", 3, 3600.00);
      Employee e = new Salary("John Adams", "Boston, MA", 2, 2400.00);
      System.out.println("Call mailCheck using Salary reference --");
      s.mailCheck();
      System.out.println("\n Call mailCheck using Employee reference--");
      e.mailCheck();
    }
}
خروجی برنامه به شکل زیر خواهد بود:
Constructing an Employee
Constructing an Employee
Call mailCheck using Salary reference --
Within mailCheck of Salary class
ailing check to Mohd Mohtashim with salary 3600.0

Call mailCheck using Employee reference--
Within mailCheck of Salary class
ailing check to John Adams with salary 2400.0
در این کد ما دو متغیر از کلاس Salary معرفی کرده ایم. یکی برای این که شئ Salary در داخل آن قرار بگیرد که نام آن s می باشد و دیگری یک شئ از کلاس Employee در درون آن قرار می گیرد و نام آن e می باشد. هنگامی که متد
s.mailCheck()
را فراخوانی می کنیم. کامپایلر متد mailCheck در درون کلاس Salary را اجرا می کند ولی زمانی که متد mailCheck را از شئ e را فراخوانی می کنیم با این که باید متد مربوط به Employee را اجرا کند ولی نتیجه متفاوت می گیریم و دلیل آن این است که متد mailCheck مربوط به کلاس Salary اجرا خواهد شد. در جاوا همه ی متدها این قابلیت را دارند که override شوند و به این رفتار فراخوانی متدهای virtual گفته می شود.Itpro باشید


نویسنده: مهدی عادلی فر
منبع: انجمن تخصصی فناوری اطلاعات ایران
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

برچسب ها
ردیف عنوان
1 آموزش برنامه نویسی جاوا قسمت اول : معرفی ویژگیها ، خصوصیات و نحوه شروع به کار با زبان برنامه نویسی جاوا
2 آموزش برنامه نویسی جاوا قسمت دوم : بررسی مفاهیم شیء ، کلاس ، Method و شروع برنامه نویسی با زبان جاوا
3 آموزش برنامه نویسی جاوا قسمت سوم: معرفی مفاهیم اولیه و مفاهیم شی گرایی در برنامه نویسی جاوا
4 آموزش برنامه نویسی جاوا قسمت چهارم: معرفی مفاهیم شی گرایی در برنامه نویسی جاوا - ادامه
5 آموزش برنامه نویسی جاوا قسمت پنجم: معرفی انواع داده ها در جاوا
6 آموزش برنامه نویسی جاوا قسمت ششم: آموزش انواع متغیر در جاوا
7 آموزش برنامه نویسی جاوا قسمت هفتم: معرفی Modifierها در جاوا
8 آموزش برنامه نویسی جاوا قسمت هشتم: معرفی و آموزش عملگرهای جاوا
9 آموزش برنامه نویسی جاوا قسمت نهم: معرفی و آموزش کار با عملگرها در جاوا - ادامه
10 آموزش برنامه نویسی جاوا قسمت دهم: کار با حلقه های تکرار در جاوا
11 آموزش برنامه نویسی جاوا قسمت یازدهم: معرفی و آموزش استفاده از عبارات شرطی در جاوا
12 آموزش برنامه نویسی جاوا قسمت دوازدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها
13 آموزش برنامه نویسی جاوا قسمت سیزدهم: معرفی انواع کلاس wrapper مربوط به اعداد در جاوا و نحوه استفاده از آنها -ادمه
14 آموزش برنامه نویسی جاوا قسمت چهاردهم: معرفی و نحوه استفاده از کلاس Wrapper مربوط به کاراکتر ها در جاوا
15 آموزش برنامه نویسی جاوا قسمت پانزدهم: معرفی و آموزش نحوه استفاده از کلاس String و کار با رشته ها در جاوا
16 آموزش برنامه نویسی جاوا قسمت شانزدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا ادامه
17 آموزش برنامه نویسی جاوا قسمت هفدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 2
18 آموزش برنامه نویسی جاوا قسمت هجدهم: معرفی و آموزش نحوه استفاده از کلاس String در جاوا و کار با رشته ها در جاوا-ادامه 3
19 آموزش برنامه نویسی جاوا قسمت نوزدهم: معرفی و آموزش نحوه استفاده از کلاس های StringBuilder و StringBuffer
20 آموزش برنامه نویسی جاوا قسمت بیستم: معرفی و آموزش نحوه استفاده از آرایه ها
21 آموزش برنامه نویسی جاوا قسمت بیست و یکم: آموزش کار با تاریخ
22 آموزش برنامه نویسی جاوا قسمت بیست و دوم: معرفی و آموزش عبارات منظم(Regular expression)
23 آموزش برنامه نویسی جاوا قسمت بیست و سوم: نحوه تعریف و استفاده از متدها
24 آموزش برنامه نویسی جاوا قسمت بیست و چهارم: نحوه تعریف و استفاده از متدها- ادامه
25 آموزش برنامه نویسی جاوا قسمت بیست و پنجم: نحوه کار با استریم ها و فایل ها
26 آموزش برنامه نویسی جاوا قسمت بیست و ششم: نحوه کار با دایرکتوری ها
27 آموزش برنامه نویسی جاوا قسمت بیست و هفتم: معرفی و آموزش کلاس ByteArrayInputStream و کار با استریم ها
28 آموزش برنامه نویسی جاوا قسمت بیست و هشتم: معرفی کلاس File و شرح متدهای آن
29 آموزش برنامه نویسی جاوا قسمت بیست و نهم: معرفی و شرح Exception ها
30 آموزش برنامه نویسی جاوا قسمت سی ام: معرفی و شرح Exception ها- ادامه
31 آموزش برنامه نویسی جاوا قسمت سی و یکم: معرفی و شرح Exception ها- ادامه 2
32 آموزش برنامه نویسی جاوا قسمت سی و دوم: معرفی و شرح استفاده از انوع کلاس های داخلی
33 آموزش برنامه نویسی جاوا قسمت سی و سوم: شرح وراثت کلاس ها و انواع آن
34 آموزش برنامه نویسی جاوا قسمت سی و چهارم: معرفی و شرح override کردن متد ها
35 آموزش برنامه نویسی جاوا قسمت سی و پنجم: معرفی و شرح چند ریختی (polymorphism)
36 آموزش برنامه نویسی جاوا قسمت سی و ششم: شرح enum و ویژگی های آن
37 آموزش برنامه نویسی جاوا قسمت سی و هفتم: معرفی و شرح abstract
38 آموزش برنامه نویسی جاوا قسمت سی و هشتم: معرفی و آموزش نحوه استفاده از کپسول بندی (encapsulation)
39 آموزش برنامه نویسی جاوا قسمت سی و نهم: معرفی و آموزش نحوه استفاده از اینترفیس ها
40 آموزش برنامه نویسی جاوا قسمت چهلم: معرفی مفهوم پکیج(package) و نحوه استفاده از آن
41 آموزش برنامه نویسی جاوا قسمت چهل و یکم: معرفی داده ساختارها - Enumeration
42 آموزش برنامه نویسی جاوا قسمت چهل و دوم: داده ساختار BitSet
43 آموزش برنامه نویسی جاوا قسمت چهل و سوم: داده ساختار Vector
44 آموزش برنامه نویسی جاوا قسمت چهل و چهارم: داده ساختار Stack(پشته)
45 آموزش برنامه نویسی جاوا قسمت چهل و پنجم: داده ساختار dictionary
46 آموزش برنامه نویسی جاوا قسمت چهل و ششم: داده ساختار Hashtable
47 آموزش برنامه نویسی جاوا قسمت چهل و هفتم: داده ساختار properites
48 آموزش برنامه نویسی جاوا قسمت چهل و هشتم: معرفی و آموزش مفهوم جنریک
49 آموزش برنامه نویسی جاوا قسمت چهل و نهم: معرفی و آموزش برنامه نویسی سوکت و شبکه سمت سرور
50 آموزش برنامه نویسی جاوا قسمت پنجاهم: معرفی و آموزش برنامه نویسی سوکت و شبکه- سمت کلاینت و ارتباط با یکدیگر
51 آموزش برنامه نویسی جاوا قسمت پنجاه و یکم: معرفی و آموزش استفاده از lambda expression
52 آموزش برنامه نویسی جاوا قسمت پنجاه و دوم:‌ معرفی مفاهیم Thread ها و Multi-Threading
53 آموزش برنامه نویسی جاوا قسمت پنجاه و سوم: معرفی و آموزشRunnable در Thread ها و Multi-Threading
54 آموزش برنامه نویسی جاوا قسمت پنجاه و چهارم: کلاس Thread و کار کردن با متدهای این کلاس
دوره مجموعه کل دوره
مطالب مرتبط

در حال دریافت اطلاعات

نظرات
هیچ نظری ارسال نشده است

    برای ارسال نظر ابتدا به سایت وارد شوید