رابطها/Interface (Java Interface)
رابطها (Interfaces): قراردادهای سفتوسخت 📜🤝
اینترفیس در جاوا سطحی پیشرفتهتر از Abstraction است. اینترفیس مانند یک "قرارداد" است که میگوید: "هر کلاسی که مرا امضا (پیادهسازی) کند، باید حتماً این متدها را داشته باشد".
۱. چرا از Interface استفاده میکنیم؟
- وراثت چندگانه: در جاوا کلاس فقط از یک والد ارث میبرد، اما میتواند بینهایت اینترفیس را پیادهسازی کند.
- امنیت: تمام متدهای اینترفیس به صورت پیشفرض
abstractوpublicهستند. - ارتباط بین کلاسهای بیربط: مثلاً هم هواپیما و هم پرنده "پرواز" میکنند، با اینکه از یک خانواده نیستند.
۲. کلمه کلیدی implements 🛠️
{code_block('interface Animal {\n void animalSound();\n}\n\nclass Pig implements Animal {\n public void animalSound() { System.out.println("Oink"); }\n}')}class MyClass implements Interface1, Interface2 { ... }
۳. تفاوت مهم با Abstract Class
<th>Abstract Class</th><th>Interface</th>| میتواند متغیر معمولی (فیلد) داشته باشد. | فقط میتواند ثابتها (final/static) داشته باشد. |
| میتواند سازنده داشته باشد. | سازنده ندارد. |
| میتواند متد با بدنه (کد) داشته باشد. | کد ندارند (به جز default methods در نسخههای جدید). |
مثال کاربردی:
در پروژههای بزرگ، دیتابیسها یا ابزارهای مختلف را با Interface تعریف میکنند تا هر زمان خواستند سیستم را عوض کنند، بقیه کدها به مشکل نخورند.
default در اینترفیس متدی با بدنه هم بنویسید تا مجبور نباشید در تمام کلاسها آن را بازنویسی کنید.
بخش تخصصی: معماری سیستمهای شیءگرا 🏗️💎
در این بخش، به مفاهیمی میپردازیم که تفاوت بین یک برنامهنویس معمولی و یک معمار نرمافزار را رقم میزند.
۱. کد تمیز و اصل ابزارمندی (Abstraction)
در پروژههای بزرگ صنعتی، ما سعی میکنیم تا حد امکان وابستگیها (Dependencies) را کاهش دهیم. استفاده درست از Interface و Abstract Class باعث میشود کدهای ما انعطافپذیر باشند. به قولی: "برنامهنویسی برای اینترفیس، نه برای پیادهسازی".
۲. مدیریت پکیجها و جلوگیری از تداخل
پکیجبندی حرفهای فقط برای نظم نیست؛ بلکه برای کنترلِ Visibility است. با استفاده درست از سطوح دسترسی (مثل protected و default) در سطح پکیج، میتوانید از دسترسیهای غیرمجاز به متدهای داخلی کلاسها جلوگیری کنید.
۳. ترکیب به جای وراثت (Composition over Inheritance)
وراثت (Inheritance) ابزار قدرتمندی است، اما استفاده بیش از حد از آن باعث ایجاد "زنجیرههای سفتوسخت" (Tight Coupling) میشود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راهحل منعطفتری برای گسترشِ کدهای شماست.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
اینترفیس Runnable متد run دارد. کلاس Car را طوری بسازید که آن را implements کند و در متد run عبارت Driving را چاپ کند.
interface Runnable {
void run();
}
class Car implements Runnable {
@Override
public void run() {
System.out.println("Driving");
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car();
myCar.run();
}
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.