فصل 18 از 40 درس 1 از 1

Abstraction و کلاس‌های انتزاعی

Abstraction و کلاس‌های انتزاعی

بخشی از آموزش جامع C# و .NET 10

محتوای درس Abstraction و کلاس‌های انتزاعی

Abstraction جزئیات غیرضروری را پنهان و یک مدل مفهومی متمرکز بر رفتارهای مهم ارائه می‌کند. Abstract Class زمانی مناسب است که Typeهای مرتبط هم قرارداد مشترک و هم بخشی از پیاده‌سازی مشترک داشته باشند.

۱. Abstract Class

از Abstract Class نمی‌توان مستقیم Object ساخت. این Class برای تعریف پایه‌ای است که فرزندان آن را تکمیل می‌کنند.

مثال

abstract class Document { public abstract string Render(); }

در این مثال، مفهوم «Abstract Class» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Abstract Method

Abstract Method بدنه ندارد و Type مشتق‌شده غیرabstract باید آن را Override کند.

مثال

class Calculator { public int Add(int a,int b)=>a+b; }
         Console.WriteLine(new Calculator().Add(2,3));

در این مثال، مفهوم «Abstract Method» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. اعضای عادی

Abstract Class می‌تواند Field، Constructor، Property و Method پیاده‌سازی‌شده داشته باشد.

مثال

abstract class Report { public string Header()=>"Report"; public abstract string Body(); }

در این مثال، مفهوم «اعضای عادی» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. Template Method

می‌توان جریان کلی یک الگوریتم را در Base Class تعریف و بعضی مراحل را به Override فرزندان واگذار کرد.

مثال

class Calculator { public int Add(int a,int b)=>a+b; }
         Console.WriteLine(new Calculator().Add(2,3));

در این مثال، مفهوم «Template Method» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. زمان استفاده

وقتی Typeها خانواده مفهومی مشترک دارند و اشتراک State یا Implementation مهم است، Abstract Class گزینه مناسبی است.

مثال

abstract class Notification { public abstract void Send(string message); }

در این مثال، مفهوم «زمان استفاده» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

public abstract class Report
         {
             public string Title { get; init; } = string.Empty;
         
             public abstract string Generate();
         
             public void Print()
             {
                 Console.WriteLine(Generate());
             }
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• استفاده از Abstract Class به‌جای Interface فقط برای اجبار پیاده‌سازی

• قرار دادن مسئولیت‌های نامرتبط در Base Class

• ایجاد Base Class بسیار بزرگ و شکننده

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

یک Abstract Class برای DocumentExporter بسازید و PdfExporter و TextExporter را با متد Export پیاده‌سازی کنید.

۱۰. جمع‌بندی

در این فصل، مبانی «Abstraction و کلاس‌های انتزاعی» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.