دوره‌ها / JAVA / رابط‌ها/Interface (Java Interface)

رابط‌ها/Interface (Java Interface)

15 دقیقه Article

رابط‌ها (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 Methods: در جاوا ۸ به بعد، می‌توانید با کلمه default در اینترفیس متدی با بدنه هم بنویسید تا مجبور نباشید در تمام کلاس‌ها آن را بازنویسی کنید.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: معماری سیستم‌های شیءگرا 🏗️💎

در این بخش، به مفاهیمی می‌پردازیم که تفاوت بین یک برنامه‌نویس معمولی و یک معمار نرم‌افزار را رقم می‌زند.

۱. کد تمیز و اصل ابزارمندی (Abstraction)

در پروژه‌های بزرگ صنعتی، ما سعی می‌کنیم تا حد امکان وابستگی‌ها (Dependencies) را کاهش دهیم. استفاده درست از Interface و Abstract Class باعث می‌شود کدهای ما انعطاف‌پذیر باشند. به قولی: "برنامه‌نویسی برای اینترفیس، نه برای پیاده‌سازی".

۲. مدیریت پکیج‌ها و جلوگیری از تداخل

پکیج‌بندی حرفه‌ای فقط برای نظم نیست؛ بلکه برای کنترلِ Visibility است. با استفاده درست از سطوح دسترسی (مثل protected و default) در سطح پکیج، می‌توانید از دسترسی‌های غیرمجاز به متدهای داخلی کلاس‌ها جلوگیری کنید.

۳. ترکیب به جای وراثت (Composition over Inheritance)

وراثت (Inheritance) ابزار قدرتمندی است، اما استفاده بیش از حد از آن باعث ایجاد "زنجیره‌های سفت‌وسخت" (Tight Coupling) می‌شود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راه‌حل منعطف‌تری برای گسترشِ کدهای شماست.

نکته پایانی: هدف از یادگیری این مفاهیمِ پیشرفته، نوشتن کدی است که نه تنها امروز کار کند، بلکه سال‌ها بعد هم به راحتی قابل تغییر و توسعه باشد.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

پیاده‌سازی قرارداد Medium
سوال تمرین

اینترفیس Runnable متد run دارد. کلاس Car را طوری بسازید که آن را implements کند و در متد run عبارت Driving را چاپ کند.

پاسخ تمرین
JAVA
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();
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.