آموزش اصول برنامه نویسی شی گرا : وراثت (Inheritance)

این مطلب بخشی از آموزش اصول برنامه نویسی شی گرا هست.هنگامی که نیاز به ایجاد یک کلاس جدید داریم ممکن است همیشه ساخت آن از ابتدا ضروری نباشد. اگه در برنامه کلاسی شبیه به کلاسی که می خواهیم بسازیم وجود داشته باشه می تونیم از وراثت (Inheritance) استفاده کنیم و بر پایه کلاس قبلی، کلاس جدیدمون رو بسازیم. وراثت این امکان رو ایجاد میکنه که کلاس جدید خصوصیات (Attributes) و متدهای (Method) کلاس موجود را به ارث ببره که قابلیت خیلی خوبی برای استفاده مجدد از کدهاست.بطور مثال می خواهیم شخصیت های موجود در یک نانوایی را الگوبرداری کنیم. ممکن است با تعریف یک کلاس برای مشتریان (Customer) شروع کنیم، که دارای ویژگی هایی برای نام مشتری، شماره تلفن، آدرس ایمیل و شماره شناسه مشتری است. بعلاوه ما به کلاس مشتری متدهایی برای بروزرسانی اطلاعات تماس خود و خرید کالاها اضافه میکنیم.نانوایی، کارمند نیز دارد بنابراین ما یک کلاس کارمند (Employee) با ویژگی های نام کارمند، شماره تلفن، آدرس ایمیل و شماره شناسه کارمند ایجاد می کنیم. کارمند می تواند اطلاعات تماس خود را بروز کند، ارتقا یابد یا بازنشسته شود. حالا هر دو کلاس را با هم مقایسه کنید. همانطور که در عکس زیر میبینید این دو کلاس شباهت های زیادی به هم دارند.هر دو کلاس دارای یک نام، شماره تلفن، آدرس ایمیل و متدی برای بروزرسانی اطلاعات تماس خود هستند (موارد نارنجی رنگ در تصویر بالا)، این موارد برای همه اشخاص مشترک است. بنابراین می توانیم بجای تعریف این خصوصیات به طور جداگانه در هر کلاس، یک کلاس با تمام این خصوصیات و متدها مشترک ایجاد کنیم و سپس کلاس های مشتری و کارمند را بر اساس آن پایه گذاری کنید.عبارت مورد استفاده در اینجا، ارث بردن (Inherit) کلاس مشتری از کلاس شخص (Person) است. این بدان معناست که کلاس مشتری به طور خودکار همه خصوصیات و متدها را از کلاس شخص، بدون نوشتن کد اضافی، بدست می آورد. توجه کنید که با اضافه کردن یک خصوصیت و یا یک متد جدید به کلاس شخص، هر دو کلاس مشتری و کارمند این خصوصیت یا متد را به ارث می برند.طبق قرارداد، اگر ما یک نمودار کلاس با وراثت ترسیم کنیم، از نوع فلش نشان داده شده در تصویر بالا برای نشان دادن رابطه بین این دو کلاس استفاده خواهیم کرد، و جهت آن را نشان می دهیم.اصطلاحی که بیشتر برای این رابطه به کار می رود این است که کلاس شخص Superclass (سوپر کلاس) است و کلاس های جدید مشتری و کارمند Subclass (زیر کلاس) های آن هستند. همچنین این موارد را به عنوان کلاس والد (Parent) و کلاس فرزند (Child) نیز خواهید دید، که معمولاً در مواردی که فقط یک سطح وراثت وجود دارد دیده میشود. یا بطور مثال زمانی که چندین سطح ارث بری داشته باشیم از کلاس پایه (Base Class) و کلاس مشتق شده (Derived Class) نیز استفاده می شود.دقت کنید که کلاس های فرزند می توانند خصوصیات و متدهای خاص خودشان را نیز داشته باشند، همانطور که در تصویر بالا مشاهده میکنید کلاس مشتری (Customer) متد خرید کالا (purchase) که مختص به خودش می باشد را علاوه بر متدهای والد خود، داراست. هیچ محدودیتی برای تعداد کلاسهای فرزندی که می توانیم بر اساس یک کلاس والد ایجاد کنیم وجود ندارد. بطور مثال اگر بعدا فهمیدیم که مغازه به یک پیک برای تحویل بسته ها نیاز دارد، اضافه کردن کلاس آن بسیار ساده است. می توانیم یک کلاس پیک (Courier) ایجاد کنیم و این کلاس از کلاس شخص ارث ببرد، سپس می توانیم متدهای خاص خودش را نیز به این کلاس اضافه کنیم.علاوه بر قابلیت استفاده مجدد از کد، نکته مهم در مورد وراثت این است که اگر در کلاس والد تغییری ایجاد کنیم، به طور خودکار کلاس های فرزند نیز از آن تاثیر میگیرند. بطور مثال زمانی که ما متوجه میشویم که برای همه اشخاص باید آدرس ایمیل را نگهداری کنیم، تنها کاری که لازم است این است که به کلاس شخص خصوصیت آدرس ایمیل را اضافه کنیم و همه کلاس های فرزند می توانند از این خصوصیت استفاده کنند. بطور حتم تغییر در یک بخش (کلاس والد) بهتر از تغییر در سه بخش (کلاس های فرزند) برنامه است.در برخی زبان های برنامه نویسی مانند Pyhton و ++C به شما اجازه ارث بری همزمان از چندین کلاس والد داده می شود، از طرفی ارث بری چندگانه ممکن است کمی گیج کننده باشد.داشتن یک والد برای ارث بری معمول تر است، زبان هایی مانند C#, Java, Swift و Ruby به شما اجازه داشتن فقط یک والد برای ارث بری را می دهند.در ادامه آموزش اصول برنامه نویسی شی گرا ما نیز از ارث بری یکتا استفاده خواهیم کرد.قسمت قبلی : آموزش اصول برنامه نویسی شی گرا : کپسوله سازی (Encapsulation)قسمت بعدی : آموزش اصول برنامه نویسی شی گرا : چند ریختی (Polymorphism)