oruji.github.io
oruji.github.ioPersian Tutorials
ویرایش: 1396/11/23 23:00
A A

پلی مورفیسم یا چندریختی در جاوا

در این آموزش از کتاب برخط جاوا (Java)، خواهیم دید که پلی مورفیسم یا چندریختی (Polymorphism) از مفاهیم شیءگرایی است و قابلیت یک تابع برای انجام کارها بر اساس شیء ای می باشد که به آن تعلق دارد. به عبارت دیگر، پلی مورفیسم در جاوا به شما اجازه می دهد که یک رابط تعریف کرده و چندین پیاده سازی از آن داشته باشید. به زبان ساده تر، با استفاده از این قابلیت می توان توابع یا متغیرهای مرجع را طوری ایجاد نمود، که در قسمت های مختلف برنامه رفتار متفاوتی داشته باشند. Polymorphism یکی از بخش های مهم شیءگرایی می باشد.

انواع چندریختی در جاوا

در شیءگرایی و جاوا دو نوع چندریختی وجود دارد، زمان اجرا (پلی مورفیسم پویا) و زمان کامپایل (پولی مورفیسم ایستا).

پلی مورفیسم زمان اجرا یا چندریختی پویا (Dynamic Polymorphism)

override کردن تابع در شیءگرایی، بهترین مثال از چندریختی زمان اجرا می باشد. در این نوع از Polymorphism مرجع کلاس X می تواند شیء ای از کلاس X یا یک شیء از هر کلاسی که فرزند کلاس X می باشد را در خود نگاه دارد. به عنوان مثال اگر کلاس Y از کلاس X مشتق شده باشد، در این صورت هر دو عبارت زیر معتبر می باشند:

Y obj = new Y(); //Parent class reference can be assigned to child object X obj = new Y();

در override کردن تابع هر دوی کلاس ها (کلاس پدر و فرزند) دارای تابع یکسانی هستند، کامپایلر نمی تواند در زمان کامپایل تشخیص دهد که کدام تابع (Method) را صدا بزند. در این مورد JVM تصمیم اینکه کدام تابع فراخوانی شود را در زمان اجرا می گیرد، که به همین دلیل آن را پلی مورفیسم زمان اجرا یا پلی مورفیسم پویا می گویند.

اجازه دهید برای درک بهتر مثالی بیاوریم:

public class X { public void methodA() { //Base class method System.out.println ("hello, I'm methodA of class X"); } } public class Y extends X { public void methodA() //Derived Class method { System.out.println ("hello, I'm methodA of class Y"); } } public class Z { public static void main (String args []) { X obj1 = new X(); // Reference and object X X obj2 = new Y(); // X reference but Y object obj1.methodA(); obj2.methodA(); } }

خروجی برنامه:

hello, I'm methodA of class X hello, I'm methodA of class Y

همانطور که مشاهده می کنید methodA دارای دو شکل متفاوت در کلاس پدر و فرزند می باشد، بنابراین می توان گفت که methodA در اینجا پلی مورفیک یا چندریختی است.

پلی مورفیسم زمان کامپایل یا چندریختی ایستا (Static Polymorphism)

پلی مورفیسم زمان کامپایل چیزی جز overload کردن تابع در جاوا نیست. به زبان ساده تر می توان گفت که یک کلاس می تواند بیشتر از یک تابع با نام یکسان داشته باشد ولی با تعداد آرگومان های متفاوت یا نوع آرگومان های متفاوت و یا هردو.

اجازه دهید برای درک بیشتر مثالی بیاوریم:

class X { void methodA(int num) { System.out.println ("methodA:" num); } void methodA(int num1, int num2) { System.out.println ("methodA:" num1 "," num2); } double methodA(double num) { System.out.println("methodA:" num); return num; } } class Y { public static void main (String args []) { X Obj = new X(); double result; Obj.methodA(20); Obj.methodA(20, 30); result = Obj.methodA(5.5); System.out.println("Answer is:" result); } }

خروجی برنامه:

methodA:20 methodA:20,30 methodA:5.5 Answer is:5.5

همانطور که در مثال بالا مشاهده می کنید، کلاس دارای سه تابع متفاوت با نام methodA می باشد یا می توان گفت که تابع methodA به طور ذاتی چندریختی است، چرا که دارای سه شکل متفاوت می باشد. در این نوع پلی مورفیسم کامپایلر (Compiler) توانایی تشخیص فراخوانی متد مورد نظر را در زمان کامپایل دارد، و به همین خاطر آن را Polymorphism زمان کامپایل می نامیم.