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

Inheritance و ارث‌بری

Inheritance و ارث‌بری

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

محتوای درس Inheritance و ارث‌بری

Inheritance رابطه is-a را میان Typeها مدل می‌کند. این ابزار در صورت استفاده صحیح امکان اشتراک رفتار پایه را فراهم می‌کند، اما ارث‌بری عمیق می‌تواند وابستگی و پیچیدگی ایجاد کند.

۱. Base و Derived Class

Class مشتق‌شده اعضای قابل دسترسی Base Class را به ارث می‌برد و می‌تواند رفتار جدید اضافه کند.

مثال

class Person { public string Name{get;init;}=""; }
         class Employee:Person { public int Id{get;init;} }

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

۲. base

کلمه base برای دسترسی به اعضای Base Class و فراخوانی Constructor پایه استفاده می‌شود.

مثال

class Entity { public Guid Id{get;} public Entity(Guid id)=>Id=id; }
         class Product:Entity { public Product(Guid id):base(id){} }

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

۳. virtual و override

متد virtual اجازه جایگزینی رفتار در Class فرزند را می‌دهد و override پیاده‌سازی جدید را تعریف می‌کند.

مثال

class Shape { public virtual double Area()=>0; }
         class Circle:Shape { public double R{get;init;} public override double Area()=>Math.PI*R*R; }

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

۴. sealed

sealed می‌تواند از ارث‌بری یک Class یا Override بیشتر یک Method جلوگیری کند.

مثال

sealed class Settings { public string Mode{get;init;}="Prod"; }

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

۵. Composition در برابر Inheritance

اگر رابطه واقعی is-a وجود ندارد، Composition معمولاً انعطاف‌پذیرتر و کم‌وابسته‌تر است.

مثال

class Engine{public void Start()=>Console.WriteLine("Start");}
         class Car{private readonly Engine _e=new(); public void Start()=>_e.Start();}

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

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

public class Employee
         {
             public string Name { get; init; } = string.Empty;
         
             public virtual decimal CalculateSalary() => 0m;
         }
         
         public class FullTimeEmployee : Employee
         {
             public decimal MonthlySalary { get; init; }
             public override decimal CalculateSalary() => MonthlySalary;
         }

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

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

• استفاده از Inheritance فقط برای اشتراک چند خط کد

• سلسله‌مراتب عمیق چندسطحی

• نادیده گرفتن Liskov Substitution در Overrideها

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

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

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

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

۹. تمرین عملی

مدل Employee با دو نوع FullTimeEmployee و HourlyEmployee بسازید و محاسبه حقوق را Override کنید.

۱۰. جمع‌بندی

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