دوره‌ها / JAVA / انتزاع/Abstraction (Java Abstraction)

انتزاع/Abstraction (Java Abstraction)

15 دقیقه Article

انتزاع (Abstraction): تمرکز روی کلیات ☁️🌁

انتزاع فرآیندی است که در آن جزئیاتِ پیچیده پیاده‌سازی را مخفی می‌کنیم و فقط "چه کاری" (و نه "چگونه") را نشان می‌دهیم. به زبان ساده، انتزاع یعنی تعریفِ یک استاندارد کلی بدون درگیر شدن با جزئیات.

۱. کلاس انتزاعی (Abstract Class)

کلاسی است که با کلمه abstract تعریف می‌شود. شما نمی‌توانید از این کلاس شیء بسازید (Instantiation ممنوع است). این کلاس فقط به عنوان الگویی برای کلاس‌های دیگر عمل می‌کند.

۲. متد انتزاعی (Abstract Method) ⚡

متدی است که بدنه (کد) ندارد. وظیفه نوشتن کدِ این متد بر عهده کلاس‌های "فرزند" است:

{code_block('abstract class Animal {\n public abstract void animalSound();\n public void sleep() { System.out.println("Zzz"); } // متد معمولی هم می‌تواند داشته باشد\n}')}
اجبار در پیاده‌سازی: هر کلاسی که از یک کلاسِ abstract ارث می‌برد، باید تمام متدهای انتزاعی آن را بازنویسی کند، وگرنه خودش هم باید abstract اعلام شود.

چرا انتزاع؟

برای ایجاد امنیت و نظم. مثلاً ما می‌دانیم هر "حیوان" باید صدایی داشته باشد، اما چون "حیوانِ عمومی" در واقعیت وجود ندارد (همیشه یک گونه خاص است)، متد صدا را انتزاعی می‌رویم تا هر گونه (سگ، گربه) صدای خودش را بنویسد.

تلفیق با چندریختی: انتزاع و چندریختی در کنار هم موتور محرک معماری‌های بزرگ هستند. شما با نوعِ abstract کار می‌کنید ولی در عمل رفتارهای کلاس‌های واقعی را می‌بینید.
<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) می‌شود. در بسیاری از موارد، استفاده از ترکیب (داشتنِ یک شیء داخل شیء دیگر) راه‌حل منعطف‌تری برای گسترشِ کدهای شماست.

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

نکته تکمیلی: انتزاع در مقابلِ ناقص بودن 🧩

کلاس انتزاعی در واقع یک کلاس "ناقص" است. جاوا اجازه ساخت شیء از آن را نمی‌دهد چون برخی از رفتارهای آن (متدهای abstract) هنوز تعریف نشده‌اند. این یک ابزار کنترلی قدرتمند برای مدیران تیم‌های نرم‌افزاری است؛ آن‌ها با تعریف یک کلاس abstract، برنامه‌نویسان دیگر را "مجبور" می‌کنند تا استانداردهای خاصی را رعایت کنند. اگر کسی فراموش کند متدی را پیاده‌سازی کند، برنامه اصلاً کامپایل نخواهد شد!

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

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

تعریف سیستم پرداخت Medium
سوال تمرین

کلاس انتزاعی Payment متد انتزاعی process دارد. کلاس CardPayment را بسازید که از آن ارث ببرد و متد را طوری پیاده‌سازی کند که متن Processing... را چاپ کند.

پاسخ تمرین
JAVA
abstract class Payment {
  public abstract void process();
}
class CardPayment extends Payment {
  @Override
  public void process() {
    System.out.println("Processing...");
  }
}
public class Main {
  public static void main(String[] args) {
    Payment p = new CardPayment();
    p.process();
  }
}

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

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