سلام دوستان. تو این مقاله می خوایم در مورد یه مفهوم مهم تو برنامه نویسی به اسم "ارث بری چندگانه" یا 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، پایتون
class MyClass(ClassA, ClassB, ClassC):
pass
در این مثال `MyClass` از کلاسهای `ClassA` و `ClassB` و `ClassC` ارث میبرد.امیدوارم این آموزش برایتان مفد بوده باشه! :)
امتیاز شما به این مطلب
امتیاز: 5 از 5 (مجموع 1 رای)
اولین نفری باشید که در مورد این مقاله نظر می دهید!
techfeed.ir© 2024 All rights reserved