پرش به محتوا

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

از ویکی‌پدیا، دانشنامهٔ آزاد

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

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

[ویرایش]

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

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

وراثت تک‌سطحی (Single Inheritance)

[ویرایش]

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

مثال در Python:

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

class Child(Parent):
    pass

child = Child()
child.greet()  # خروجی: Hello from Parent

ویژگی‌ها:

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

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

[ویرایش]

در این نوع، یک کلاس از کلاسی ارث‌بری می‌کند که خودش از کلاس دیگری ارث‌بری کرده است. این ساختار به‌صورت سلسله‌مراتبی ادامه پیدا می‌کند.

مثال در 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:

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:

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:

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):

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)


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

[ویرایش]

مزایا

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

معایب

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

منابع

[ویرایش]

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

  1. "Object-Oriented Programming and Java". Java Programming Blog. Retrieved from https://www.journaldev.com/. Liskov, Barbara H. (1987). Data Abstraction and Hierarchy. ACM Computing Surveys. Retrieved from https://dl.acm.org/doi/10.1145/360114.360121. "Object-Oriented Programming in C++". E. Balagurusamy, McGraw-Hill Education. This textbook provides a thorough explanation of inheritance and other object-oriented concepts in C++ programming. ISBN: 978-1259026742. "Object-Oriented Software Construction" by Bertrand Meyer (1988). Prentice Hall. ISBN: 978-0136291554. This book presents key principles in object-oriented software design, including inheritance. "The Object-Oriented Thought Process" by Matt Weisfeld (1998). Addison-Wesley. ISBN: 978-0201657832. This book delves into the core concepts of object-oriented programming, such as inheritance and polymorphism. "Java: The Complete Reference" by Herbert Schildt (2011). McGraw-Hill Education. ISBN: 978-0071606302. This book covers the use of inheritance in Java, one of the most widely used object-oriented languages. کاراکتر line feed character در |عنوان= در موقعیت 107 (کمک); پیوند خارجی در |title= وجود دارد (کمک)