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

وراثت در برنامه‌نویسی شبیه وراثت بیولوژیکی است که در آن فرزندان صفاتی را از والدین به ارث می‌برند. در برنامه‌نویسی شیءگرا می‌توان با وراثت از کلاس موجود کلاسی را ایجاد کرد که داده‌ها و متدهای کلاس قبلی را به ارث ببرد. برای فرزند یک کلاس می‌توان توابع و متغیرهای جدید تعریف کرد یا توابع مربوط به والد را دوباره‌نویسی (override) نمود .

## انواع وراثت در برنامه‌نویسی شیءگرا
وراثت در برنامه‌نویسی شیءگرا به روش‌های مختلفی پیاده‌سازی می‌شود که هرکدام کاربردها و ویژگی‌های خاص خود را دارند. در ادامه، انواع وراثت و توضیحات مرتبط ارائه می‌شود:

* وراثت تک‌سطحی (Single Inheritance)
* وراثت چندسطحی (Multilevel Inheritance)

* وراثت چندگانه (Multiple Inheritance)
* وراثت ترکیبی (Hybrid Inheritance)
* وراثت سلسله‌مراتبی (Hierarchical Inheritance)
* مسئله الماس (Diamond Problem) در وراثت

## وراثت تک‌سطحی (Single Inheritance)
در وراثت تک‌سطحی، یک کلاس فرزند تنها از یک کلاس والد ارث‌بری می‌کند. این ساده‌ترین نوع وراثت است و برای انتقال خصوصیات و رفتارها از یک کلاس به کلاس دیگر استفاده می‌شود.

**مثال در Python:**
```python
class Parent:
    def greet(self):
        print("Hello from Parent")

class Child(Parent):
    pass

child = Child()
child.greet()  # خروجی: Hello from Parent
```
**ویژگی‌ها:**

* ساده‌ترین نوع وراثت.
* ارتباط مستقیم و واضح بین کلاس والد و کلاس فرزند.

## وراثت چندسطحی (Multilevel Inheritance)
در این نوع، یک کلاس از کلاسی ارث‌بری می‌کند که خودش از کلاس دیگری ارث‌بری کرده است. این ساختار به‌صورت سلسله‌مراتبی ادامه پیدا می‌کند.

**مثال در Python:**
```python
class Grandparent:
    def greet(self):
        print("Hello from Grandparent")

class Parent(Grandparent):
    pass

class Child(Parent):
    pass

child = Child()
child.greet()  # خروجی: Hello from Grandparent
```
**ویژگی‌ها:**

* ارث‌بری سلسله‌مراتبی.
* افزایش پیچیدگی با عمق زیاد سلسله‌مراتب.

## وراثت چندگانه (Multiple Inheritance)
در وراثت چندگانه، یک کلاس می‌تواند از چندین کلاس والد ارث‌بری کند. این نوع وراثت گاهی منجر به مشکلاتی مانند **مسئله الماس (Diamond Problem)** می‌شود.

**مثال در Python:**
```python
class Parent1:
    def greet(self):
        print("Hello from Parent1")

class Parent2:
    def greet(self):
        print("Hello from Parent2")

class Child(Parent1, Parent2):
    pass

child = Child()
child.greet()  # خروجی: Hello from Parent1 (اولویت با Parent1 است)
```
**ویژگی‌ها:**

* امکان استفاده از خصوصیات و رفتارهای چند کلاس والد.
* ممکن است باعث ابهام در ارث‌بری شود.

## وراثت ترکیبی (Hybrid Inheritance)
وراثت ترکیبی ترکیبی از انواع مختلف وراثت (تک‌سطحی، چندسطحی و چندگانه) است. این نوع وراثت برای استفاده از مزایای انواع مختلف وراثت استفاده می‌شود.

**مثال در Python:**
```python
class Base:
    def greet(self):
        print("Hello from Base")

class Parent1(Base):
    pass

class Parent2(Base):
    pass

class Child(Parent1, Parent2):
    pass

child = Child()
child.greet()  # خروجی: Hello from Base
```
**ویژگی‌ها:**

* انعطاف‌پذیری بالا.

* مستعد مشکلات پیچیدگی و ابهام در ارث‌بری.

## وراثت سلسله‌مراتبی (Hierarchical Inheritance)
در این نوع وراثت، چند کلاس فرزند از یک کلاس والد مشترک ارث‌بری می‌کنند.

**مثال در Python:**
```python
class Parent:
    def greet(self):
        print("Hello from Parent")

class Child1(Parent):
    pass

class Child2(Parent):
    pass

child1 = Child1()
child2 = Child2()
child1.greet()  # خروجی: Hello from Parent
child2.greet()  # خروجی: Hello from Parent
```
**ویژگی‌ها:**

* یک کلاس والد به چندین کلاس فرزند ارث‌بری می‌دهد.
* ساده و کاربردی در سیستم‌های درختی.

## مسئله الماس (Diamond Problem) در وراثت
**مسئله الماس** یکی از چالش‌های رایج در وراثت چندگانه است. این مسئله زمانی رخ می‌دهد که دو کلاس والد از یک کلاس اصلی ارث‌بری کنند و یک کلاس فرزند بخواهد از هر دو والد ارث‌بری کند.

**حل این مسئله در Python با استفاده از MRO (Method Resolution Order):**
```python
class A:
    def greet(self):
        print("Hello from A")

class B(A):
    pass

class C(A):
    pass

class D(B, C):
    pass

d = D()
d.greet()  # خروجی: Hello from A (بر اساس ترتیب MRO)
```


## مزایا و معایب وراثت در برنامه‌نویسی شیءگرا

### مزایا

* **قابلیت استفاده مجدد از کد**:
*# یکی از مهم‌ترین مزایای وراثت، کاهش کدنویسی تکراری است. کلاس فرزند می‌تواند از خصوصیات و رفتارهای کلاس والد استفاده کند، بدون نیاز به بازنویسی آن‌ها.
*# این ویژگی باعث می‌شود که تغییرات در یک مکان اعمال شوند و نیازی به ویرایش در چندین جای مختلف نباشد.
* **کاهش پیچیدگی**:
*# با استفاده از وراثت، می‌توان سلسله‌مراتب منطقی میان کلاس‌ها ایجاد کرد که درک سیستم را ساده‌تر می‌کند.
*# رابطه «والد-فرزند» به توسعه‌دهندگان کمک می‌کند که ساختار برنامه را به‌صورت طبیعی‌تر طراحی کنند.

### معایب

* **مشکلات مرتبط با وراثت چندگانه**:
*# در زبان‌هایی که از وراثت چندگانه پشتیبانی می‌کنند، ممکن است مشکلاتی مانند **مسئله الماس (Diamond Problem)** رخ دهد، که در آن یک کلاس فرزند از دو کلاس والد ارث‌بری می‌کند که هر دو یک خصوصیت یا متد مشابه دارند.
* **وابستگی‌های بیش‌ازحد**:
*# وراثت می‌تواند وابستگی شدیدی میان کلاس‌ها ایجاد کند. اگر تغییری در کلاس والد ایجاد شود، ممکن است به‌طور غیرمنتظره‌ای روی کلاس‌های فرزند تأثیر بگذارد.
*# این وابستگی‌ها مدیریت و نگهداری کد را دشوارتر می‌کند.

## منابع
برنامه‌نویسی به زبان C++، تألیف جعفرنژاد


رده:برنامه‌نویسی شیءگرا
رده:سیستم‌های انواع
رده:کلاس (برنامه‌نویسی)