Kamal Farahani
Kamal Farahani
خواندن ۳ دقیقه·۷ سال پیش

وراثت در شئ گرایی: قسمت اول مفهوم وراثت

در برنامه نویسی مفهومی وجود دارد به اسم code reuse یا استفاده مجدد از کد که به زبان ساده یعنی اجتناب از کار بیهوده کردن برای مثال: فرض کنید شما در صد جا از کد برنامه تان نیاز دارید که بفهمید یک عدد اول است یا نه، به جای اینکه صد بار در صد جای مختلف قطعه کدی که مربوط به شناسایی اعداد اول هست را بنویسید آن قطعه کد را به یک تابع تبدیل می کنید و هر جا که نیاز به شناسایی یک عدد اول داشتید آن تابع را با ورودی عدد مورد نظر فراخوانی می کنید و تمام؛ بنابراین یک بار کد را می نویسید و هر چندبار که خواستید از آن استفاده می کنید.

وراثت هم مفهومی هست که برای استفاده مجدد از کد در سطح class های برنامه به وجود آمده است اجازه بدهید مثالی بزنم:

فرض کنید شما در برنامه خود یک class به اسم Person با Property ها و Method های نشان داده در شکل زیر دارید:

Person class
Person class

که در شکل بالا قسمت سبز Property های کلاس ما و قسمت آبی Method های آن هستند.

حالا فرض کنید که ما در همین برنامه نیازمند یک کلاس دیگر به اسم Customer می شویم با Method ها و Property های زیر:

customer class
customer class

همانطور که می بینید تمام ویژگی ها و رفتارهای کلاس Person با کلاس Customer یکسان هستند به جز یک Property در کلاس Customer به اسم customerNumber.

حال ما می توانیم که دوباره از اول کلاس Customer را مثل کلاس Person بنویسیم و فقط یک Property به نام customerName به آن اضافه کنیم یا اینکه به کلاس Person یک Property به اسم customerNumber اضافه کنیم و دیگر کلاس Customer را ایجاد نکنیم و به جای آن از کلاس Person استفاده کنیم. اما هردوی این روش ها مشکل دارند در روش اول کار اضافی می کنیم و در روش دوم که بدتر است کلاس Person را خراب می کنیم چون هر شئ Person یک Property به اسم customerNumber ندارد و این Property هیچ ربطی به کلاس Person ندارد.

اما اگر از زاویه ای دیگر به این قضیه نگاه کنیم متوجه رابطه ای بین این دو کلاس می شویم و آن رابطه این است که در واقع Customer یک Person است به علاوه یک Property اضافی به اسم customerName.

اگر جمله بالا را فهمیده باشید در حقیقت مفهوم وراثت را در شئ گرایی فهمیده اید به نظر من وراثت یا Inheritance واژه مناسبی برای این مفهوم نیست و واژه مناسب تری که می شد برای این مفهوم انتخاب شود گسترش یا Extension است چون مثلا در این مثال کلاس Customer کلاس Person را گسترش می دهد و ویژگی ها یا رفتارهای جدیدی علاوه بر آنهایی که داشت به آن اضافه می کند. گفته می شود در وراثت رابطه is a بین دو کلاس برقرار است یعنی اینکه در این مثال:

Customer is a Person.

پس کلاس Customer از کلاس Person می تواند ارث بری کند اما نه برعکس. و وقتی کلاس Customer از کلاس Person ارث بری می کند تمام Property ها و Method های آن کلاس را به دست می آورد و بعد از آن می تواند Property ها و Method های دیگری به آن اضافه کند.

نکته: به کلاسی که شئ دیگر از آن ارث می برد Supercalss یا Parent class و به کلاسی که از کلاس دیگری ارث بری می کند Subclass یا Child class می گویند.

مثلا در مثال بالا Person یک Superclass و Customer یک Subclass است.

درضمن وراثت را روی نمودار با یک فلش توخالی از Subclass به Superclass نشان می دهند مانند:

نمودار وراثت
نمودار وراثت

پس وقتی بین دو کلاس رابطه is a برقرار است ما به جای نوشتن دوباره کد از وراثت استفاده می کنیم.

در پست بعدی نحوه پیاده سازی وراثت را در زبان های مختلف با کد بررسی می کنیم.

وراثشئ گراییوراثت در شی گراییوراثت در شئ گراییوراثت جاوا
یک علاقه مند به علوم کامپیوتر نظری، هوش مصنوعی، یادگیری ماشین و علوم اعصاب!
شاید از این پست‌ها خوشتان بیاید