وراثت و چندریختی در جاوا
وراثت (Inheritance) و چندریختی (Polymorphism) دو مفهوم اصلی در برنامهنویسی شیءگرا هستند که در زبان جاوا نیز کاربرد گستردهای دارند. این مفاهیم به ما این امکان را میدهند که کد را به صورت مقیاسپذیرتر و قابل نگهداریتر بنویسیم.
وراثت (Inheritance) در جاوا:
وراثت به معنای این است که یک کلاس میتواند ویژگیها و رفتارهای یک کلاس دیگر را به ارث ببرد. این ویژگیها و رفتارها شامل فیلدها (متغیرها) و متدها (توابع) میشوند. در جاوا، این مکانیزم به توسعهدهندگان این امکان را میدهد که یک کلاس جدید را بر اساس کلاس موجود ایجاد کنند، بدون نیاز به نوشتن مجدد کد.
ویژگیها:
-
کلاس پایه (Superclass):
کلاسهایی که ویژگیها و رفتارهای خود را به کلاسهای دیگر منتقل میکنند. این کلاسها معمولاً کلیتر و عمومیتر هستند. -
کلاس فرزند (Subclass):
کلاسهایی که ویژگیها و رفتارها را از کلاس پایه ارث میبرند و میتوانند آنها را گسترش دهند یا تغییر دهند. -
کلیدواژه extends:
در جاوا از کلمهکلیدی extends برای ایجاد یک کلاس فرزند از کلاس پایه استفاده میشود. -
وراثت تکلایه:
جاوا تنها از وراثت تکلایه پشتیبانی میکند، به این معنا که یک کلاس میتواند تنها از یک کلاس دیگر ارث ببرد (وراثت چندگانه برای کلاسها مجاز نیست).
مثال:
void eat() {
System.out.println("این حیوان غذا میخورد.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("این سگ پارس میکند.");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // ارثبری از کلاس Animal
dog.bark(); // متد مختص کلاس Dog
}
}
در این مثال، کلاس Dog از کلاس Animal ارث میبرد و از متد eat() که در کلاس پایه تعریف شده استفاده میکند. علاوه بر این، کلاس Dog متد مخصوص خود به نام bark() را نیز دارد.
چندریختی (Polymorphism) در جاوا:
چندریختی به معنای توانایی یک شیء برای اتخاذ اشکال مختلف است. در جاوا، این ویژگی به این معناست که یک متد میتواند بر اساس نوع شیء که آن را فراخوانی میکند رفتارهای مختلفی داشته باشد. این امکان برای متدها و متغیرها وجود دارد که به گونهای رفتار کنند که نوع داده یا شیء مشخص در زمان اجرا تعیین شود.
انواع چندریختی:
-
چندریختی در زمان کامپایل (Compile-time Polymorphism) یا Overloading: این نوع چندریختی زمانی رخ میدهد که یک کلاس چندین متد با نام یکسان اما با پارامترهای مختلف داشته باشد. تصمیمگیری در مورد اینکه کدام متد فراخوانی شود، در زمان کامپایل انجام میشود.
-
چندریختی در زمان اجرا (Runtime Polymorphism) یا Overriding: این نوع چندریختی زمانی اتفاق میافتد که یک متد در کلاس فرزند پیادهسازی میشود و رفتار متد در زمان اجرا بسته به نوع شیء تغییر میکند.
Overloading (چندریختی در زمان کامپایل):
مثال:
// متدهای اوورلود شده
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(5, 3)); // استفاده از متد add با آرگومانهای int
System.out.println(calc.add(5.5, 3.2)); // استفاده از متد add با آرگومانهای double
}
}
در اینجا، متد add دو بار تعریف شده است، یکی برای اعداد صحیح و دیگری برای اعداد اعشاری. کامپایلر در زمان کامپایل تصمیم میگیرد که کدام نسخه از متد فراخوانی شود.
Overriding (چندریختی در زمان اجرا):
مثال:
void sound() {
System.out.println("این حیوان صدای خاصی ندارد.");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("این سگ پارس میکند.");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("این گربه میو میکند.");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
myAnimal.sound(); // خروجی: این حیوان صدای خاصی ندارد.
myDog.sound(); // خروجی: این سگ پارس میکند.
myCat.sound(); // خروجی: این گربه میو میکند.
}
}
در این مثال، متد sound در کلاسهای فرزند Dog و Cat پیادهسازی شده است. در زمان اجرا، بسته به نوع شیء (myDog یا myCat)، متد مربوطه فراخوانی میشود.
مزایای استفاده از وراثت و چندریختی:
-
بازاستفاده از کد:
وراثت این امکان را میدهد که کدهای موجود را در کلاسهای دیگر مجدداً استفاده کنید و نیاز به نوشتن کدهای تکراری نباشد. -
انعطافپذیری:
با استفاده از چندریختی، میتوانید رفتارهای مختلفی را برای متدها بسته به نوع شیء داشته باشید که این باعث انعطافپذیری بیشتر در برنامه میشود. -
کاهش پیچیدگی:
با استفاده از وراثت و چندریختی، میتوانید ساختار برنامه خود را سادهتر کنید و از نوشتن کدهای تکراری جلوگیری کنید.
نتیجهگیری:
- وراثت (Inheritance): اجازه میدهد که کلاسها ویژگیها و رفتارهای یک کلاس دیگر را به ارث ببرند و بر اساس نیاز آنها را گسترش دهند.
- چندریختی (Polymorphism): به شما این امکان را میدهد که رفتارهای مختلفی را برای یک متد در شرایط مختلف داشته باشید، چه در زمان کامپایل و چه در زمان اجرا.
استفاده از این دو مفهوم در طراحی برنامههای شیءگرا باعث میشود که کد شما مقیاسپذیرتر، قابل نگهداریتر و منعطفتر باشد.
