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 و ارثبری» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.