در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism)

با سلام به همه دوستان و همراهان 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 باشید

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی و توسعه نرم افزار وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.

#چند_ریختی_در_جاوا #متد_های_virtual_در_جاوا #برنامه_نویسی_جاوا #آموزش_برنامه_نویسی_جاوا #polymorphism_در_برنامه_نویسی_شئ_گرا #override_کردن_متدها_در_جاوا #آموزش_جاوا #polymorphism_در_جاوا #آشنایی_با_مفهوم_polymorphism #دوره_آموزشی_جاوا
عنوان
1 آموزش جاوا (Java) قسمت 1 : معرفی ، خصوصیات و شروع به کار رایگان
2 آموزش جاوا (Java) قسمت 2 : شی گرایی قسمت یک رایگان
3 آموزش جاوا (Java) قسمت 3: شی گرایی قسمت دو رایگان
4 آموزش جاوا (Java) قسمت 4 : شی گرایی قسمت سه رایگان
5 آموزش جاوا (Java) قسمت 5 : انواع داده رایگان
6 آموزش جاوا (Java) قسمت 6 : انواع متغیر رایگان
7 آموزش جاوا (Java) قسمت 7 : Modifier ها رایگان
8 آموزش جاوا (Java) قسمت 8 : عملگرها قسمت یک رایگان
9 آموزش جاوا (Java) قسمت 9 : عملگرها قسمت دو رایگان
10 آموزش جاوا (Java) قسمت 10 : حلقه های تکرار رایگان
11 آموزش جاوا (Java) قسمت 11 : عبارات شرطی رایگان
12 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
13 آموزش جاوا (Java) قسمت 12 : کلاس Wrapper اعداد رایگان
14 آموزش جاوا (Java) قسمت 14: کلاس Wrapper کاراکترها رایگان
15 آموزش جاوا (Java) قسمت 15 : کلاس String و کار با رشته قسمت یک رایگان
16 آموزش جاوا (Java) قسمت 16 : کلاس String و کار با رشته قسمت دو رایگان
17 آموزش جاوا (Java) قسمت 17 : کلاس String و کار با رشته قسمت سه رایگان
18 آموزش جاوا (Java) قسمت 18 : کلاس String و کار با رشته قسمت چهار رایگان
19 آموزش جاوا (Java) قسمت 19 : StringBuilder و StringBuffer رایگان
20 آموزش جاوا (Java) قسمت 20 : استفاده از آرایه ها رایگان
21 آموزش جاوا (Java) قسمت 21 : آموزش کار با تاریخ رایگان
22 آموزش جاوا (Java) قسمت 22 : عبارات منظم (Regular Expression) رایگان
23 آموزش جاوا (Java) قسمت 23 : تعریف و استفاده از متدها قسمت یک رایگان
24 آموزش جاوا (Java) قسمت 24 : تعریف و استفاده از متدها قسمت دو رایگان
25 آموزش جاوا (Java) قسمت 25 : کار با استریم ها و فایل ها رایگان
26 آموزش جاوا (Java) قسمت 26 : کار با دایرکتوری ها رایگان
27 آموزش جاوا (Java) قسمت 27 : کلاس ByteArrayInputStream رایگان
28 آموزش جاوا (Java) قسمت 28 : معرفی کلاس File و متدها رایگان
29 آموزش جاوا (Java) قسمت 29 : معرفی و شرح Exception ها قسمت 1 رایگان
30 آموزش جاوا (Java) قسمت 30 : معرفی و شرح Exception ها قسمت 2 رایگان
31 آموزش جاوا (Java) قسمت 31 : معرفی و شرح Exception ها قسمت 3 رایگان
32 آموزش جاوا (Java) قسمت 32 : استفاده از انوع کلاس های داخلی رایگان
33 آموزش جاوا (Java) قسمت 33 : وراثت کلاس ها و انواع آن رایگان
34 آموزش جاوا (Java) قسمت 34 : Override کردن متد ها رایگان
35 آموزش جاوا (Java) قسمت 35 : چند ریختی (Polymorphism) رایگان
36 آموزش جاوا (Java) قسمت 36 : Enum و ویژگی های آن رایگان
37 آموزش جاوا (Java) قسمت 37 : معرفی Abstract رایگان
38 آموزش جاوا (Java) قسمت 38 : استفاده از کپسول بندی (Encapsulation) رایگان
39 آموزش جاوا (Java) قسمت 39 : استفاده از اینترفیس ها رایگان
40 آموزش جاوا (Java) قسمت 40 : پکیج(Package) و نحوه استفاده رایگان
41 آموزش جاوا (Java) قسمت 41 : معرفی داده ساختارها Enumeration رایگان
42 آموزش جاوا (Java) قسمت 42 : داده ساختار BitSet رایگان
43 آموزش جاوا (Java) قسمت 43 : داده ساختار Vector رایگان
44 آموزش جاوا (Java) قسمت 44 : داده ساختار Stack (پشته) رایگان
45 آموزش جاوا (Java) قسمت 45 : داده ساختار Dictionary رایگان
46 آموزش جاوا (Java) قسمت 46 : داده ساختار Hashtable رایگان
47 آموزش جاوا (Java) قسمت 47 : داده ساختار Properites رایگان
48 آموزش جاوا (Java) قسمت 48 : معرفی و آموزش جنریک (Generic) رایگان
49 آموزش جاوا (Java) قسمت 49 : برنامه نویسی سوکت و شبکه قسمت 1 رایگان
50 آموزش جاوا (Java) قسمت 50 : برنامه نویسی سوکت و شبکه قسمت 2 رایگان
51 آموزش جاوا (Java) قسمت 51 : استفاده از Lambda Expression رایگان
52 آموزش جاوا (Java) قسمت 52 : Thread و Multi-Threading رایگان
53 آموزش جاوا (Java) قسمت 53 : Runnable در Thread و Multi-Threading رایگان
54 آموزش جاوا (Java) قسمت 54 : کلاس Thread و متدها رایگان
زمان و قیمت کل 0″ 0
0 نظر

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

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....