رابطها و کلاسهای انتزاعی در جاوا
در زبان برنامهنویسی جاوا، رابطها (Interfaces) و کلاسهای انتزاعی (Abstract Classes) هر دو ابزارهایی هستند که برای طراحی و سازماندهی کد استفاده میشوند. با این حال، این دو مفهوم تفاوتهای مهمی دارند که به طور کلی در موارد خاصی از هرکدام استفاده میشود.
رابطها (Interfaces):
رابطها در جاوا مجموعهای از امضاهای متدها هستند که هیچ پیادهسازی ندارند. یک رابط به کلاسها این امکان را میدهد که متدهایی را از آن ارثبری کنند بدون اینکه نیاز به پیادهسازی جزئیات آنها در خود رابط باشد.
ویژگیها:
-
عدم پیادهسازی:
یک رابط فقط میتواند امضای متدها را تعریف کند و هیچ پیادهسازیای برای آنها ندارد. به عبارت دیگر، تمام متدهای داخل یک رابط به صورت پیشفرض abstract هستند. -
Multiple Inheritance:
در جاوا، یک کلاس میتواند از چندین رابط پیروی کند. این به توسعهدهندگان این امکان را میدهد که از ویژگیهای چندین رابط استفاده کنند، در حالی که جاوا وراثت چندگانه را برای کلاسها محدود کرده است. -
تعریف قرارداد:
رابطها به عنوان یک قرارداد عمل میکنند. یعنی هر کلاسی که یک رابط را پیادهسازی کند باید تمام متدهای آن رابط را پیادهسازی کند. -
استفاده از default و static:
در نسخههای جدیدتر جاوا (جاوا 8 و بالاتر)، رابطها میتوانند متدهای با پیادهسازی (با استفاده از کلمه کلیدی default) داشته باشند، ولی این پیادهسازیها اختیاری هستند.
مثال:
void makeSound();
}
class Dog implements Animal {
public void makeSound() {
System.out.println("Bark");
}
}
کلاسهای انتزاعی (Abstract Classes):
کلاسهای انتزاعی کلاسهایی هستند که میتوانند شامل متدهای انتزاعی (بدون پیادهسازی) و متدهای غیر انتزاعی (با پیادهسازی) باشند. این کلاسها به عنوان پایه برای سایر کلاسها استفاده میشوند و امکان ارثبری جزئیات پیادهسازی را فراهم میکنند.
ویژگیها:
-
پیادهسازی جزئیات:
یک کلاس انتزاعی میتواند هم متدهای انتزاعی (بدون پیادهسازی) و هم متدهای با پیادهسازی داشته باشد. این به شما این امکان را میدهد که برخی رفتارها را در کلاس انتزاعی پیادهسازی کرده و سایر رفتارها را به کلاسهای فرزند واگذار کنید. -
یک ارثبری تنها:
در جاوا، یک کلاس میتواند فقط از یک کلاس انتزاعی ارث ببرد (چرا که جاوا ارثبری چندگانه را برای کلاسها محدود کرده است). -
استفاده از abstract:
در کلاسهای انتزاعی، متدهایی که قرار است پیادهسازی نشوند باید با کلمه کلیدی abstract علامتگذاری شوند.
مثال:
abstract void makeSound();
void sleep() {
System.out.println("Sleeping...");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Bark");
}
}
تفاوتهای اصلی بین رابطها و کلاسهای انتزاعی:
-
پیادهسازی:
- رابطها هیچ پیادهسازیای ندارند (مگر در جاوا 8 به بعد که میتوانند متدهای پیشفرض default داشته باشند).
- کلاسهای انتزاعی میتوانند متدهایی با یا بدون پیادهسازی داشته باشند.
-
وراثت:
- یک کلاس میتواند از چندین رابط پیروی کند.
- یک کلاس میتواند فقط از یک کلاس انتزاعی ارث ببرد.
-
محدوده استفاده:
- رابطها معمولاً برای تعریف یک قرارداد یا ویژگی مشترک بین کلاسها استفاده میشوند.
- کلاسهای انتزاعی برای فراهم کردن یک پیادهسازی پایه برای کلاسهای فرزند استفاده میشوند.
-
چندگانه بودن:
- رابطها به دلیل امکان پیادهسازی چندگانه از چندین رابط توسط یک کلاس انعطافپذیری بیشتری دارند.
- کلاسهای انتزاعی نمیتوانند از چندین کلاس دیگر ارثبری کنند.
نتیجهگیری:
- از رابطها زمانی استفاده کنید که بخواهید قراردادهایی برای متدهای خاص تعریف کنید که ممکن است توسط چندین کلاس مختلف پیادهسازی شوند.
- از کلاسهای انتزاعی زمانی استفاده کنید که بخواهید پیادهسازی مشترکی را برای گروهی از کلاسها فراهم کنید، اما نیاز به یک پیادهسازی خاص برای برخی متدها هم دارید.
