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

قبل از ذکر مثال به طور ضمنی توضیحی در مورد Overriding داده خواهد شد. البته به طور حتم برنامه نویسان با Overriding  آشنا هستند.

هر کلاس فرزند می تواند عینا(با ورودی و خروجی یکسان) متد های کلاس پدر را برای خودش پیاده سازی کند. در واقع در یک کلاس فرزند متد یا متد هایی  باشند که کاملا از نظر نام متد، تعداد و نوع ورودی ها و نوع خروجی با کلاس پدر یکسان باشند اما بدنه متفاوت داشته باشند. به عنوان مثال:

public class Parent {
public void printClassName(){
System.out.println("Parent");
}
}
public class Child extends Parent {
public void printClassName(){
System.out.println("Child");
}
}

public class Main {
public static void main(String[] args) {
Parent p= new Parent();
p.printClassName();

Child c= new Child();
c.printClassName();
}
}

خروجی چاپ شده به شکل زیر خواهد بود:

Parent
Child

پس واضح است که وقتی یک متد override می شود زمانی که بر روی نمونه پدر صدا زده می شود متد پدر و زمانی که روی نمونه فرزند می شود صدا زده می شود متد مربوط به فرزند را اجرا می کند.

حال به مفهوم چند ریختی می پردازیم:

چند ریختی در شی گرایی

تصویر بالا را قبلا در پست مربوط به مفاهیم شی گرایی استفاده  کرده بودم. مثال این پست هم در مورد همین تصویر است.

فرض می کنیم یک interface به نام Animal داریم که parent کلاس های مربوط به تمام حیوانات است. در این کلاس یک متد ()Speak داریم که صدای حیوانات را پرینت می کند:

public interface Animal {
void speak();
}

مطابق شکل سه حیوان مختلف داریم که از Animal ارث می برند و متد speak را override می کنند:

public class Dog implements Animal {

public void speak(){
System.out.println("Woof");
}
}
public class Cat implements Animal {
public void speak() {
System.out.println("Meow");
}
}
public class Duck implements Animal {
public void speak(){
System.out.println("Quack");
}
}

حال اگر به شکل زیر از حیوانات نمونه بسازیم شاهد چند ریختی خواهیم بود:

public class Main {
public static void main(String[] args) {

Animal animal1= new Cat();
Animal animal2= new Dog();
Animal animal3=new Duck();

animal1.speak();
animal2.speak();
animal3.speak();
}
}

خروجی :

Meow
Woof
Quack

همانطور که در شکل و در خروجی می بینیم با ساخت سه حیوان و صدا کردن یک متد روی آن شاهد خروجی های مختلف هستیم. این حالت و قابلیت شی گرایی چند ریختی نامیده می شود. در واقع حیوان یا animal در spaek شکل های مختلف به خود گرفته است.