آخرین بروزرسانی 2 ماه قبل

میراث متعدد (Multiple Inheritance) چیست؟

ارث بری چندگانه چیست و چرا باید درمورد آن بدانیم؟

سلام دوستان. تو این مقاله می خوایم در مورد یه مفهوم مهم تو برنامه نویسی به اسم "ارث بری چندگانه" یا Multiple Inheritance صحبت کنیم. شاید اسمش یکم ترسناک به نظر برسه، ولی نگران نباشید. سعی می کنم خیلی ساده و روون توضیح بدم که همه متوجه بشن. فرض کنید شما دارید یه برنامه مینویسید که یه سری اشیاء (objects) داره. این اشیاء میتونن ویژگی ها و رفتارهای مختلفی داشته باشن. ارث بری چندگانه یه راهیه که یه شیء بتونه همزمان ویژگی ها و رفتارهای چند تا شیء دیگه رو به ارث ببره. یه جورایی انگار بچه چند تا پدر و مادر باشه!

برای اینکه بهتر متوجه بشید، اول باید یه کم در مورد مفهوم "ارث بری" یا Inheritance بدونیم. ارث بری یعنی یه کلاس (class) بتونه از یه کلاس دیگه ویژگی هاش رو بگیره. به کلاس اولی که ارث می گیره میگیم "کلاس فرزند" (child class) و به کلاس دومی که ویژگی هاش به ارث میرسه میگیم "کلاس والد" (parent class). حالا، ارث بری چندگانه یعنی چی؟ یعنی یه کلاس فرزند میتونه از چند تا کلاس والد به طور همزمان ارث ببره.

مثالی برای فهم بهتر

فرض کنید ما یه کلاس داریم به اسم پرنده (Bird) که ویژگی هایی مثل پر زدن (fly) و نفس کشیدن (breathe) داره. یه کلاس دیگه هم داریم به اسم شناگر (Swimmer) که ویژگی هایی مثل شنا کردن (swim) و نفس کشیدن زیر آب (breathe_underwater) داره. حالا، ما یه کلاس میخوایم بسازیم به اسم مرغابی (Duck) که هم پرنده است و هم شناگر. یعنی هم میتونه پر بزنه و هم شنا کنه. اینجا میتونیم از ارث بری چندگانه استفاده کنیم.


    class Bird:
        def fly(self):
            print("من دارم پرواز می کنم.")

        def breathe(self):
            print("من دارم نفس می کشم.")

    class Swimmer:
        def swim(self):
            print("من دارم شنا می کنم.")

        def breathe_underwater(self):
            print("من دارم زیر آب نفس می کشم.")

    class Duck(Bird, Swimmer):
        pass

    my_duck = Duck()
    my_duck.fly()         # خروجی: من دارم پرواز می کنم.
    my_duck.swim()        # خروجی: من دارم شنا می کنم.
    my_duck.breathe()     # خروجی: من دارم نفس می کشم.
    my_duck.breathe_underwater() # خروجی: من دارم زیر آب نفس می کشم.
    

تو این مثال، کلاس Duck از دو کلاس Bird و Swimmer ارث بری می کنه. به همین خاطر، هم میتونه پر بزنه و هم شنا کنه. تو خیلی از زبا های برنامه نویسی مثل پایتون، ارث بری چندگانه امکان پذیره.

مزایا و معایب

ارث بری چندگانه یه ابزار قدرتمنده، ولی استفاده ازش باید با دقت انجام بشه. مثل هر ابزار دیگه ای، هم مزایایی داره و هم معایبی:

مزایا معایب
امکان ترکیب ویژگی ها و رفتارهای چند کلاس مختلف پیچیدگی بیشتر کد
کاهش حجم کد (با استفاده مجدد از کدها) مشکلات مربوط به "الماس ارث بری" (Diamond Problem)
افزایش انعطاف پذیری کد درک سخت تر کد برای برنامه نویسان جدید

یکی از معایب مهم ارث بری چندگانه، "مسئله الماس" یا "Diamond Problem" هست. این مسئله زمانی اتفاق میوفته که یه کلاس از دو کلاسی ارث ببره که هر دو از یه کلاس والد مشترک ارث بردن. تو این حالت، ممکنه ابهام پیش بیاد که کلاس فرزند باید از کدوم کلاس والد، ویژگی رو بگیره. برای مثال، فرض کنید کلاس A والد کلاس های B و C است. حالا کلاس D از کلاس های B و C ارث می برد. اگر هر سه کلاس A و B و C متدی به اسم ‍`method` داشته باشند، کلاس D کدام متد را باید اجرا کند؟ متد کلاس B یا متد کلاس C یا اصلا متد کلاس A؟ حل این مشکل یکمی سخطه و برنامه نویس باید خیلی دقت کنه.

البته، راه حل هایی هم برای این مشکل وجود داره. بعضی از زبون های برنامه نویسی مثل پایتون، مکانیزم های خاصی دارن که این مشکل رو حل می کنن. یکی از این مکانیزم ها، "ترتیب روش حل" یا "Method Resolution Order" (MRO) هست. MRO مشخص می کنه که وقتی یه متد تو چند تا کلاس والد وجود داره، کدوم متد باید اجرا بشه.

مثال: یک نوع ساختمان را در نظر بگیرید. ساختمان میتواند یک اداره و هم یک منزل باشد. در اینجا ساختمان پدر است و اداره و منزل فرزند. حالا اگر بخواهیم ساختمان دو منظوره داشته باشیم، میتوانیم از دو کلاس اداره و منزل ارث بری کنیم!

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

خلاصه

تو این مقاله، در مورد ارث بری چندگانه صحبت کردیم. یاد گرفتیم که ارث بری چندگانه یعنی یه کلاس بتونه همزمان از چند تا کلاس والد ارث ببره. همچنین، مزایا و معایب این روش رو بررسی کردیم و در مورد "مسئله الماس" هم صحبت کردیم. امیدوارم این مقاله براتون مفید بوده باشه. اگه سوالی داشتید، حتما بپرسید!

کلیدواژه ها

ارث بری چندگانه، Multiple Inheritance، کلاس، شیء، برنامه نویسی، مسئله الماس، Method Resolution Order، پایتون

سوال: آیا همه زبون های برنامه نویسی از ارث بری چندگانه پشتیبانی می کنن؟
جواب: نه، همه زبون ها از این قابلیت پشتیبانی نمیکنن. زبان هایی مثل جاوا و سی شارپ از ارث بری چندگانه پشتیبانی نمیکنن، ولی زبان هایی مثل پایتون و ++C این امکان رو دارن.
سوال: اگه یه کلاس از چند تا کلاس والد ارث ببره که متدهای هم نام داشته باشن، چه اتفاقی میوفته؟
جواب: این مسئله به زبون برنامه نویسی بستگی داره. تو پایتون، "ترتیب روش حل" یا MRO مشخص میکنه که کدوم متد باید اجرا بشه. تو زبون های دیگه، ممکنه لازم باشه که شما به صورت دستی مشخص کنید که کدوم متد رو میخواید استفاده کنید.
سوال: آیا بهتر است از ارث بری چندگانه استفاده کنیم؟
جواب: استفاده از ارث بری چندگانه باید با دقت انجام بشه. اگه می تونید با راه حل های ساده تر مشکلتون رو حل کنید، بهتره از ارث بری چندگانه استفاده نکنید. اما اگر واقعا بهش نیاز دارید، حتما قبلش مزایا و معایبش رو در نظر بگیرید.
سوال: MRO چیست؟
جواب: MRO (Method Resolution Order) یک الگوریتم است که ترتیب جستجوی متدها در کلاس هایی که از چندین کلاس ارث بری می کنند را مشخص می کند. این الگوریتم به جلوگیری از ابهام در زمانی که چندین کلاس والد یک متد با نام یکسان دارند کمک می کند.
سوال: چگونه میتوانم یک کلاس را از چند کلاس به ارث برم؟
جواب: برای این کار در زبانی مانند پایتون، نام کلاس های والد را به ترتیب در داخل پرانتز جلوی نام کلاس فرزند مینویسیم. توجه کنید ترتیبی که کلاس ها را در پرانتز مینویسیم، در MRO تاثیرگذار است. مثالی برای درک بهتر:
class MyClass(ClassA, ClassB, ClassC):
pass
در این مثال `MyClass` از کلاسهای `ClassA` و `ClassB` و `ClassC` ارث میبرد.

امیدوارم این آموزش برایتان مفد بوده باشه! :)

به اشتراک گذاشتن این مطلب در شبکه های اجتماعی

امتیاز شما به این مطلب

امتیاز: 5 از 5 (مجموع 1 رای)

اولین نفری باشید که در مورد این مقاله نظر می دهید!

6692- V14
Terms & Conditions | Privacy Policy

techfeed.ir© 2024 All rights reserved