ارث‌بری (Inheritance) در برنامه‌نویسی شیءگرا

ارث بری در برنامه نویسی، برنامه نویسی شئی گرا، اصول برنامه نویسی شئی گرا، OOP در برنامه نویسی 1404/8/15
نویسنده: مدرس بهمن آبادی

ارث‌بری (Inheritance) در برنامه‌نویسی شیءگرا

ارث بری در برنامه نویسی

مقدمه

در دنیای واقعی، هر چیزی از چیزهای قبل از خودش ویژگی‌هایی به ارث می‌برد.
فرزند، بعضی خصوصیات پدر و مادرش را دارد — رنگ چشم، قد، یا حتی طرز فکر.
در برنامه‌نویسی شیءگرا هم دقیقاً همین مفهوم وجود دارد، که به آن ارث‌بری (Inheritance) می‌گویند.

تعریف ساده

ارث‌بری یعنی یک کلاس (فرزند) بتواند ویژگی‌ها (Properties) و رفتارها (Methods) را از کلاس دیگری (پدر یا پایه) به ارث ببرد.
به این ترتیب می‌توانیم کد را بازاستفاده (Reuse) کنیم و ساختارهای مشابه را مرتب‌تر و قابل نگهداری‌تر بنویسیم.

در زبان‌هایی مثل C# و Java، برای تعریف ارث‌بری از علامت : استفاده می‌شود:

class Animal
{
    public void Eat() => Console.WriteLine("Eating...");
}

class Dog : Animal
{
    public void Bark() => Console.WriteLine("Barking...");
}

در این مثال:

  • Dog از Animal ارث‌بری کرده است.

  • یعنی هر Dog هم می‌تواند Eat() را انجام دهد و هم Bark() را.

 

چرا ارث‌بری مهم است؟

ارث‌بری یکی از چهار اصل پایه‌ای OOP است (در کنار Encapsulation، Abstraction و Polymorphism).
اهمیتش در چند چیز خلاصه می‌شود:

۱. کاهش تکرار کد (Code Reusability)

وقتی چند کلاس رفتارهای مشترک دارند، لازم نیست آن رفتار را در هرکدام تکرار کنی.
کافی است در کلاس پدر بنویسی، و بقیه از آن ارث ببرند.

۲. افزایش خوانایی و ساختار منطقی

ارث‌بری به کد ساختار می‌دهد. وقتی یک نفر به کلاس‌ها نگاه می‌کند، رابطه‌ی منطقی بین آن‌ها را می‌فهمد:

“هر سگ، حیوان است.”
“هر مدیر، کارمند است.”
“هر خودرو، وسیله نقلیه است.”

این روابط باعث می‌شوند طراحی نرم‌افزار، طبیعی‌تر و قابل فهم‌تر باشد.

۳. امکان گسترش راحت (Extensibility)

اگر بخواهی ویژگی جدیدی برای تمام حیوانات اضافه کنی (مثلاً قابلیت نفس کشیدن)، کافی است فقط کلاس پایه (Animal) را تغییر دهی.
تمام فرزندان به‌صورت خودکار آن ویژگی را خواهند داشت.

مفهوم Override و Virtual

گاهی می‌خواهی رفتار کلاس فرزند با کلاس پدر متفاوت باشد.
در این حالت از مفاهیم virtual و override استفاده می‌کنی.

class Animal
{
    public virtual void Speak() => Console.WriteLine("Some sound...");
}

class Dog : Animal
{
    public override void Speak() => Console.WriteLine("Woof!");
}

 

اینجا، هر حیوانی می‌تواند صدایی داشته باشد، ولی سگ صدای خاص خودش را دارد.
این همان چندریختی (Polymorphism) است که با ارث‌بری کامل می‌شود.

نکته مهم: ارث‌بری بی‌جا ممنوع!

یکی از اشتباهات رایج در طراحی نرم‌افزار این است که از ارث‌بری فقط برای صرفه‌جویی در چند خط کد استفاده شود.
اگر بین دو کلاس رابطه‌ی واقعی “است” (is-a) وجود ندارد، نباید از ارث‌بری استفاده کنی.

مثلاً:

  • “سگ، حیوان است” (درسته)

  • “ماشین، راننده است” (غلطه – چون رابطه‌ی «دارد» هست نه «است»)

در چنین مواردی باید از Composition (ترکیب) استفاده کنی، نه ارث‌بری.

مثال واقعی‌تر

فرض کن در یک سیستم اداری، چند نوع کارمند داری:

class Employee
{
    public string Name { get; set; }
    public void Work() => Console.WriteLine($"{Name} is working");
}

class Manager : Employee
{
    public void ManageTeam() => Console.WriteLine($"{Name} is managing the team");
}

class Developer : Employee
{
    public void WriteCode() => Console.WriteLine($"{Name} is writing code");
}

حالا وقتی Manager یا Developer می‌سازی، خودش به‌صورت خودکار همه ویژگی‌های Employee را دارد.

در دوره جامع برنامه‌نویسی وب مهندس بهمن‌آبادی، تمامی مفاهیم پایه‌ای و پیشرفته‌ی شیءگرایی از جمله سازنده‌ها (Constructors)، ارث‌بری (Inheritance)، چندریختی (Polymorphism) و کپسوله‌سازی (Encapsulation) با جزئیات کامل و مثال‌های واقعی آموزش داده شده‌اند. در این دوره، دانشجو نه‌تنها با تئوری مفاهیم آشنا می‌شود، بلکه یاد می‌گیرد چگونه در پروژه‌های واقعی وب آن‌ها را پیاده‌سازی کند تا به طراحی نرم‌افزارهایی ساخت‌یافته، قابل نگهداری و حرفه‌ای برسد.

نتیجه‌گیری

ارث‌بری ابزاری قدرتمند است که اگر درست استفاده شود، کد را:

  • ساده‌تر

  • قابل‌فهم‌تر

  • قابل‌گسترش‌تر
    و بسیار شیءگراتر می‌کند.

اما اگر بی‌هدف از آن استفاده شود، می‌تواند به‌سرعت باعث پیچیدگی، وابستگی زیاد، و سختی در نگهداری نرم‌افزار شود.

پس ارث‌بری مثل شمشیر دولبه است — در دستان طراح درست، ابزار قدرت است؛ در دستان بی‌تجربه، منبع دردسر.