وراثت در زبانهای برنامه نویسی شیء گرا
یکی از چهار اصلی بنیادین OOP یا «برنامه نویسی شیء گرایی» وراثت بود که پیش از این با آن آشنا شدیم. حتی اگر شما با استفاده از یک زبان برنامه نویسی شیء گرا هیچ کلاسی نسازید و هیچ کلاسی از کلاس دیگری ارث بری نکند، باز هم شما در حال استفاده از مفهومی تحت عنوان Inheritance یا «وراثت» خواهید بود! در واقع، در بسیاری از زبانهای برنامه نویسی شیء گرا، همواره شما در حال استفاده از اصل وراثت هستید. حقیقت امر این است که وراثت در برنامه نویسی شیء گرایی آنقدر هم که به نظر میرسد پیچیده نیست. چند لحظهای برنامه نویسی، کلاس، متد، آبجکت و … را فراموش کرده و جملات زیر را مرور کنیم:
– ماشین یک نوع وسیله ی نقلیه است.
– اتوبوس یک نوع وسیله ی نقلیه است.
– روباه یک نوع حیوان است.
– اسب یک نوع حیوان است.
-حساب جاری یک نوع حساب بانکی است.
– حساب پس انداز یک نوع حساب بانکی است.
حال کمی هم میتوان مسأله را پیچیدهتر کرد به این صورت که:
– پراید یک نوع ماشین است که یک نوع وسیله ی نقلیه است.
– پژو یک نوع ماشین است که یک نوع وسیله ی نقلیه است.
قضیه را از این هم پیچیدهتر میتوان کرد:
– شیانلو یک نوع سگ است که یک نوع پستاندار است که یک نوع حیوان است.
– بولداگ یک نوع سگ است که یک نوع پستاندار است که یک نوع حیوان است.
با این توضیحات به نظر میرسد که اکنون وراثت در برنامه نویسی را بهتر متوجه شویم. برای مثال، یکی از جملات فوق را تفسیر می کنیم. در نمونه ی آخر، بولداگ یکسری از ویژگی هایش را از سگ به ارث می برد و سگ هم دارای یکسری ویژگی های موجودی به نام پستاندار است و پستاندار هم خصوصیاتش را از چیزی تحت عنوان حیوان به ارث برده است. به طور خلاصه، همانطور که قبلاً هم توضیح دادیم زمانی که یک کلاس تمامی یا برخی از قابلیت هایش را از کلاس دیگری بگیرد، این کلاس اصطلاحاً از کلاس دیگر ارث بری می کند. در یو ام ال، ارث بری را به صورت زیر نمایش خواهیم داد:
همانطور که در تصویر فوق مشخص است، در طراحی یو ام ال کلاسهای فرزند با یک فلش به طرف کلاس والد مشخص می شوند. به عبارت دیگر، فلش از سمت کلاسی که از کلاس اصلی ارث بری میکند کشیده می شود. در چنین شرایطی، کلاسهای InvestmentAccount و SavingAccount و CurrentAccount تمامی ویژگیهای کلاس BankAccount را به ارث خواهند برد.
پیش از این هم توضیح دادیم که بسیاری از زبانهای برنامه نویسی شیء گرا این امکان را به برنامه نویس میدهند تا در صورت نیاز، تمامی یا برخی از ویژگیهای کلاس والد را اصطلاحاً Override کند و یا ویژگیهای جدیدی به کلاس فرزند اضافه کند که کلاس والد فاقد آنها است.
public class SavingAccount extends BankAccount { }
همانطور که در کد فوق ملاحظه می شود، در زبان برنامه نویسی جاوا برای این که کلاس SavingAccount از کلاس BankAccount ارث بری کند، می بایست از کلیدواژه ای تحت عنوان extends استفاده نماییم. کلیدواژه ی extends به معنی «توسعه یافتن از» میباشد و چنانچه بخواهیم کد فوق را به زبان فارسی ترجمه کنیم، با معادلی همچون «کلاسی قابل روئیت از همه جای برنامه تحت عنوان حساب پس انداز از حسابی به نام حساب بانکی ارث بری می کند»!