اگه میخوای موارد زیر از جاوا رو بدونی جلسه بیست و چهارم رو دانلود کن
چندریختی را بهتر یادبگیریم
این آموزش مکملی برای درک بهتر مفهوم چندریختی است
با مثال های بیشتر سعی شده این مفهوم روشن تر شود
جلسه قبل در مورد چندریختیصحبت کردیم برای درک بهتر این مبحث مهم شی گرایی جلسه ای دیگر را نیز به چندریختی اختصاص داده ایم.قبل از مطالعه این جلسه، جلسه قبل یعنی چندریختی در جاوا را مطالعه کنید.
پلی مورفیسم یا چندریختی یکی از مفاهیم شی گرایی در جاوا است.این مفهوم تا حدودی دشوار و گیج کننده است!!! به همین خاطر یک جلسه دیگه هم برای بررسی این مفهوم چغر و بد بدن قرار داده ایم :-)
دلیل گیج کننده بودن این مفهوم این است که نسبت به سایر مفاهیمی که تا الان بررسی کردم انتزاعی است،با این حال شما میتونید در پلی مورفیسم استاد بشید و برآن مسلط بشید و به کمر خاکش کنید 😊
برای یادگیری بهتر چندریختی یا هر مفهوم جاوای دیگر باید تمرین و مثال عملی زیادی حل کنید تا یواش یواش مفهومش دستتون بیاد.چون امکان داره توضیحات تئوری جز گیج تر کردن شما دست آورد دیگه ای نداشته باشه.
بیایید صدای گربه را بررسی کنید!!!!! گربه یک عمل صداکردنی داره و صدای آن میو میو...!!!! هستش سگ هم صدا داره و عمل صدا کردن سگ واق واق...... هستش!!!! پس قبول میکنید که هر حیوانی یک عمل صدا کردنی دارد که بین همه ی آنها مشترک هستش اما با صدایی متفاوت؟!!!!!!!!!!!!!!!!!
عمل صدا کردن را یک متد به نام ()makeSound در نظر میگیریم .
تفاوت صدا گربه با سگ و سایر حیوانات را دستور درون متد در نظر میگیریم.
یعنی یک متد که نام مشترکی برای همه حیوانات دارد اما دستوری ( تفاوت صدا) متفاوت.
مثلا متد ()makeSound را برای حیوانات بصورت زیر بررسی میکنیم:
گربه
public void makeSound(){ System.out.println("Miu Miu...."); } |
سگ
public void makeSound(){ System.out.println("Vagh Vagh...."); } |
مرغ
public void makeSound(){ System.out.println("ghot ghot...."); } |
در سه مثال بالا همان طور که مشاهده میکنید سه متد با نام یکسان ( عمل صدا کرد) اما دستوری متفاوت ( تفاوت در صدای حیوانات) در بدنه خود دارند.یعنی همه حیوانات()makeSound (عمل صدا کردن ) را دارند اما دستوری متفاوت ( صدایی متفاوت) با توجه به نوع حیوان به نمایش میزارند.
قبول دارید که مرغ و خروس و سگ و گربه و.... همه حیوان هستند اما در شکل و قالبی متفاوت. یعنی گربه حیوانی است که در شکل گربه ظاهر شده یا مرغ حیوانی است که در شکل مرغ ظاهر شده یعنی نوع همه آنها حیوان است اما در شکل گربه و مرغ و خروس و... ظاهر شده اند.
چندریختی یا پلومورفیسم هم این مفهوم را بیان میکند،چندریختی میگه یک حیوان میتونه در شکل های گوناگون ظاهر شود.مثلا یک حیوان متد ()makeSound و عمل صدا کردن را دارا است.حالا این متد با توجه به نوع حیوان عمل (صدای) متفاوتی را به نمایش میگذارد.
در چندریختی تمرکز ما روی متدهای مشترک با دستورات متفاوت است.
مثل متد صدا کردن که بین همه حیوانات مشترک هست اما برای هر حیوان دستور صدا متفاوت است.
در چندریختی مثلا وقتی کلاس حیوان میخواد در شکل کلاس گربه،کلاس سگ،کلاس مرغ ظاهر شود متدهایی نظیر عمل صدا کردن که بین گربه و سگ و مرغ مشترک هست در همه این کلاس ها override (بازنویسی) میشود.یعنی متد صدا کردن که درون کلاس حیوان هست با توجه به نوع صدا و دستور هر حیوان درون کلاس های گربه و سگ و مرغ override میشود.
کلاس Animal را در زیر مشاهده میکنید که متد makeSound در بدنه آن پیاده سازی شده است که یک دستور کلی را اجرا میکند. این یعنی همه حیوانات یک عمل صدا کردنی را دارند اما نوع صدا کردن باتوجه به نوع حیوان تغییر میکند.خب حالا ما میخواهیم متد ()makeSound در کلاس Animal صدای گربه را بدهد. برای این کار باید یک کلاس تعریف کنیم به نام Cat که کلاس Animal را به ارث میبرد. متد makeSound کلاس Animal را در کلاس Cat override (بازنویسی) میکنیم یعنی همون متد با همون نام با همون پارامتر و با همان نوع اما بادستوری متفاوت را در کلاس فرزند یعنی Cat پیاده سازی میکنیم.
class Animal { System.out.println("animal sounds"); } class Cat extends Animal { System.out.println("miu miu"); } |
• ما برای این که متد ()makeSound کلاس Animal صدای گربه بدهد یعنی کلاس Animal در زمینه صدا کردن به شکل گربه دربیاد متد makeSound را درون کلاس Cat، override کرده ایم.
• حالا ما باید کاری کنیم که وقتی یک شی از کلاس Animal ایجاد کردیم اون شی زمانی که متد makeSound را صدا میزند بجای پیام "animal sounds" پیام "miu miu" را در خروجی چاپ کند.یعنی شی کلاس Animal به شکل شی کلاس Cat ظاهر شود. یعنی وقتی شی کلاس Animal میخواد عمل صدا کردن را انجام دهد بگه “miu miu” خب چطور باید این کار را انجام بدیم؟
پس رسالت این است که ما کلا با شی کلاس پدر یعنی Animal سروکار داریم و کلاس های فرزند نظیر کلاس گربه که کلاس حیوان را به ارث برده است در عمل فقط یک حالت انتزاعی و پنهان هستند و ما تنها طرف حسابمون کلاس و شی پدر هستش.
قبل از این که ادامه این مثال را بررسی کنیم بزارید تا یک مثال از دنیای واقعی برای درک این موضوع برای شما بگم:
ایا شما پرنده ٌطرقه را میشناسید؟طرقه پرنده ای خوش آواز هستش که اواز آن تقلیدی از آواز سایر پرندگان است.یعنی طرقه گاهی به شکل بلبل درمیاد و اواز بلبل را سر میدهد گاهی شبیه قناری ظاهر میشه و مثل قناری میخواند گاهی به شکل پرنده ای دیگر در میاید و میخواند.
پرنده طرقه شبیه به گنجشک و خاکستری رنگ است. ما در آواز خوانی طرقه هیچ ظاهری و شمایلی از قناری خوش رنگ و بلبل و .... نمیبینیم گویی قناری و بلبل و... در کالبد طرقه پنهان شده اند و با وجود این که صدای سایر پرندگان را میشنویم اما طرف حساب ما تنها پرنده طرقه هست. یعنی میتوان گفت پرندگان دیگر طرقه را به ارث برده اند و طرقه پدر آنها هستش و متد آواز خوانی طرقه در بدنه همه کلاس های فرزندان بازنویسی شده و طرقه میتونه از این طریق به شکل هر کدوم از پرنده ای که دوست دارد ظاهر شود و اواز بخواند. در چندریختی هم دقیقا همین طور هست همه فرزندان کلاس پدر در کالبد پدر پنهان شده اند و پدر با دستور خاص خود به شکل هر فرزندی که دوست داشت درمی آید. تغییر شکل کلاس پدر به شکل کلاس فرزند در قالب متد رخ میدهد. خب ما در پلی مورفیسم هم تنها با شی کلاس پدر سرو کار داریم و شی کلاس پدر تنها به تمام ویژگی ها و رفتار های کلاس خودش دسرسی دارد با این تفاوت که هر متدی از کلاس پدر که در کلاس فرزند override یا بازنویسی شده هنگام صدا زدن آن به جای اجرای دستور متد پدر دستور متد فرزند اجرا میشود. مثلا متد ()makeSound که درون کلاس Animal هستش و دستور "Animal Sounds " را در خروجی چاپ میکند اگر این متد در کلاس یکی از فرزندان مثلا کلاس Cat، override یا بازنویسی شود و دستور درون این متد در کلاس Cat به چاپ پیام "miu miu" تغییر کند.شی ای که به روش چند ریختی (پلی مورفیسم) از کلاس پدر یعنی Animal ایجاد میشود هنگام صدا زدن متد ()makeSound بجای چاپ پیام "animal sounds" که درون کلاس پدر یعنی Animal قرار دارد دستور چاپ پیام "miu miu" این متد که درون کلاس فرزند یعنی Cat قرار دلرد را اجرا میکند.دقیقا شبیه پرنده طرقه که ما در ظاهر با طرقه سر و کار داریم اما طرقه آواز قناری را میخواند.
خب تا اینجا شما بصورت تئوری با مفهوم چندریختی آشنا شدید حالا میخواهیم کد مثال بالا که شی حیوان میخواد به شکل شی گربه دربیاد را بصورت عملی پیاده سازی کنیم:
در مثال زیر شی سازی حالت عادی که از کلاس ها ایجاد میکردیم را مشاهده میکنید:
package polymorphism_JavaPro; class Animal { System.out.println("animal sounds"); public void eat() { System.out.println("animal eat"); class Cat extends Animal { System.out.println("miu miu"); } public class Test { public static void main(String[] args) { } |
خروجی:
animal eat animal sounds |
• در این مثال یک شی به نام a1 از کلاس Animal ایجاد کرده ایم.
• شی a1 به تمام ویژگی ها و رفتارهای کلاس Animal دسرسی دارد.
• از طریق شی a1 متدهای ()makeSound و ()eat را صدا زده ایم.
• همان طور که مشاهده میکنید دستورات اجرا شده درون این دو متد کاملا متعلق به کلاس Animal هستش.
• حالا قصد داریم کلاس Animal در شکل کلاس Cat ظاهر شود مثلا وقتی شی ای از کلاس Animal ساختیم آن شی صدای گربه را دربیارد. برای این کار کلاس Cat باید کلاس Animal را به ارث ببرید و متدی (عمل صدا کرد) makeSound() کلاس Animal را درون کلاس Cat بازنویسی و override کنیم. حالا وقت شی ساختن از کلاس Animal میرسه که این شی همان طور که گفتیم تنها و تنها و تنها!!!!!!! به متغیرها و متدهای کلاس پدر یعنی Animal دسرسی دارد.یعنی مثل روان عادی که شی یک کلاس میتونه به متغیرها و متدهای کلاسش دسرسی پیدا کند و فقط تنها تفاوت این است که شی کلاس Animal هنگام صدا زدن متدهایی از کلاس Animal که در کلاس فرزندش یعنی Cat، override شده بجای اجرای دستورات خود متد پدر ،دستور override شده اجرا میشود:
• خب ما تا اینجا کلاس Animal و کلاس Cat را ایجاد کرده ایم و کلاس Cat کلاس Animal را به ارث برده است و متد makeSound درون کلاس Cat ،override شده است حالا وقت شی ساختن از کلاس Animal به روش چندریختی هست برای این کار در جلسه قبل شی ساختن یک کلاس بصورتی که در شکل شی کلاس دیگر ظاهر شود را یادگرفیتیم اما دوباره مروری میکنیم:
سازنده کلاس فرزند + new + = + نام شی + نام کلاس پدر |
شی ساختن به روش چندریختی یعنی وقتی شی کلاس پدر میخواد در شکل شی کلاس فرزند ظاهر شود بصورت بالاست.
......ادامه این جلسه آموزشی را بصورت کامل و مرتب شده در لینک زیر دانلود کنید:(در صورت خرابی لینک گزارش دهید)
این جلسه آموزشی را میتوانید بصورت کتاب الکترونیکی (PDF شده) در لینک زیر دریافت کنید.
لینک دانلود
بستن *نام و نام خانوادگی * پست الکترونیک * متن پیام |
دوره های آموزشی برنامه نویسی
انجام پروژه های برنامه نویسی
تدریس خصوصی برنامه نویسی
بیش از 7 سال از فعالیت جاواپرو میگذرد
جاواپرو دارای مجوز نشر دیجیتال از وزارت فرهنگ و ارشاد اسلامی است
جهت ارتباط مستقیم با جاواپرو در واتساپ و تلگرام :
09301904690
بستن دیگر باز نشو! |