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

Polymorphism

Polymorphism

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

محتوای درس Polymorphism

Polymorphism اجازه می‌دهد کد با یک قرارداد مشترک کار کند و رفتار واقعی بر اساس Type نمونه انتخاب شود. این ویژگی وابستگی به شرط‌های نوع‌محور را کاهش می‌دهد.

۱. Runtime Polymorphism

زمانی که متد virtual از طریق Reference نوع پایه فراخوانی شود، CLR پیاده‌سازی Overrideشده Type واقعی را اجرا می‌کند.

مثال

Shape s=new Circle{R=2};
         Console.WriteLine(s.Area());

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

۲. Compile-time Polymorphism

Method Overloading نمونه‌ای از چندریختی در زمان کامپایل است که انتخاب متد بر اساس Signature انجام می‌شود.

مثال

static int Parse(string x)=>int.Parse(x);
         static int Parse(ReadOnlySpan<char> x)=>int.Parse(x);

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

۳. Reference نوع پایه

Collectionی از Base Type می‌تواند نمونه‌های Typeهای مشتق‌شده مختلف را نگه دارد.

مثال

Shape[] shapes={new Circle{R=1},new Circle{R=2}};
         foreach(var s in shapes) Console.WriteLine(s.Area());

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

۴. جایگزینی شرط با رفتار

به‌جای switch روی نوع Object، رفتار مشترک را می‌توان در Contract قرار داد و هر Type پیاده‌سازی خود را ارائه کند.

مثال

interface IDiscount{decimal Apply(decimal x);}
         class Vip:IDiscount{public decimal Apply(decimal x)=>x*.85m;}

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

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

List<Employee> employees =
         [
             new FullTimeEmployee { MonthlySalary = 40_000_000m },
             new HourlyEmployee { HourlyRate = 250_000m, Hours = 160 }
         ];
         
         foreach (Employee employee in employees)
         {
             Console.WriteLine(employee.CalculateSalary());
         }

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

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

• بررسی مداوم نوع با is و switch به‌جای استفاده از Contract

• Override کردن رفتاری که معنای Base Contract را می‌شکند

• ترکیب بیش از حد Overloadهای مشابه و مبهم

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

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

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

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

۸. تمرین عملی

سیستم ارسال اعلان با Base Type یا Interface طراحی کنید که Email، SMS و Push رفتار Send متفاوت داشته باشند.

۹. جمع‌بندی

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