polymorphism در Java
اشیای متفاوت را در متغیر typed والد نگه دارید تا یک نام فراخوانی بتواند بدنههای متفاوت اجرا کند. روی Machine متد horn را نگه دارید تا tone چاپ کند. روی Truck متد horn را بازنویسی کنید تا honk چاپ کند. روی Car متد horn را بازنویسی کنید تا beep چاپ کند. در Yard.java بنویسید Machine m = new Machine();، Machine t = new Truck(); و Machine c = new Car();، بعد روی هر کدام horn را صدا بزنید. با javac Yard.java ترجمه کنید و java Yard را اجرا کنید. صفحه باید اول tone، بعد honk، بعد beep را نشان دهد. دموی دوم فقط دو فرزند را بهعنوان ارجاع Machine نگه میدارد. equals را برای صفحهٔ بعد بگذارید — این درس یک نوع والد است که شکلهای بسیار نگه میدارد.
یک نوع والد، سه بدنهٔ horn
صفحهٔ abstract یک متد را ناتمام گذاشت تا فرزندها پر کنند. این صفحه روی فراخوانی از طریق متغیر typed والد تمرکز میکند. فایل Yard.java را باز کنید. نام کلاس عمومی را Yard نگه دارید. دموهای فقطabstract اگر داستان typed والد را دفن میکنند، فایلهای enum Level، دموهای مسیر، و هر Scanner صفحهکلید را پاک کنید. برنامه نباید منتظر تایپ بماند. به سطر import نیاز ندارید.
یک والد عادی با بدنهٔ horn اعلام کنید:
class Machine {
void horn() {
System.out.println("tone");
}
}
فرزندها را با extends Machine و بدنههای خودشان برای horn اعلام کنید که honk و beep چاپ کنند. نام یکسان و فهرست پارامتر خالی یعنی هر فرزند متد والد را override میکند.
داخل Yard.main سه متغیر بسازید که نوع اعلامشدهشان Machine است:
Machine m = new Machine();
Machine t = new Truck();
Machine c = new Car();
بعد صدا بزنید:
m.horn();
t.horn();
c.horn();
نوع اعلامشده برای هر سه Machine است. شیء واقعی تصمیم میگیرد کدام بدنهٔ horn اجرا شود.
class Machine {
void horn() {
System.out.println("tone");
}
}
class Truck extends Machine {
void horn() {
System.out.println("honk");
}
}
class Car extends Machine {
void horn() {
System.out.println("beep");
}
}
public class Yard {
public static void main(String[] args) {
Machine m = new Machine();
Machine t = new Truck();
Machine c = new Car();
m.horn();
t.horn();
c.horn();
}
}
از پوشهای که Yard.java را نگه میدارد javac Yard.java را اجرا کنید. وقتی پرانتز، آکولاد و نقطهویرگول درست باشند، javac سطر خروجی خودش نمینویسد. بعد java Yard را اجرا کنید — نه java Yard.java. پسوند .java را از دستور اجرا بردارید. یک کلاس عمومی در فایل بگذارید تا نام با Yard یکی باشد. نوعهای کمکی در این شکل مبتدی بدون public میمانند.
صفحه اول tone، بعد honk، بعد beep را نشان میدهد. یکبار اجرا را قدمبهقدم ببینید. Java از Yard.main شروع میکند. m یک Machine ساده نگه میدارد، پس m.horn() مقدار tone چاپ میکند. t یک Truck نگه میدارد حتی اگر نوع متغیر Machine بگوید، پس t.horn() مقدار honk چاپ میکند. c یک Car نگه میدارد، پس c.horn() مقدار beep چاپ میکند. املای فراخوانی یکسان. سه بدنه.
وقتی صفحه را میخوانید به هر اختصاص اشاره کنید و سطر جور صفحه را ببینید. سطر اول مال ماشین ساده است. سطر دوم مال شیء truck پشت نام typed ماشین است. سطر سوم مال شیء car پشت نام typed ماشین است. همان بازیِ جور کردن در یک مرور کل درس است.
اگر هنوز فقط از دموی abstract مقدار honk بعد park میبینید، به فایل تدریس polymorphism برگردید و دوباره java Yard را اجرا کنید. اگر هر متغیر فقط Truck یا Car typed شده، هنوز شکل typed والد این صفحه را نشان نمیدهید — برای دمو نوع Machine را سمت چپ اختصاصها نگه دارید.
قانون را بلند بگویید وقتی صفحه را میبینید: نوع متغیر میتواند والد باشد، شیء میتواند فرزند باشد، وقتی فرزند متد را override کرده فراخوانی بدنهٔ فرزند را اجرا میکند. در این صفحه override مربوط به equals اختراع نکنید. آن موضوع برای درس بعدی است.
دو فرزند از طریق ارجاع Machine
برنامهٔ دوم overrideها را نگه میدارد. main فقط Truck و Car میسازد، هنوز بهعنوان Machine ذخیره میکند، و روی هر کدام horn را صدا میزند.
class Machine {
void horn() {
System.out.println("tone");
}
}
class Truck extends Machine {
void horn() {
System.out.println("honk");
}
}
class Car extends Machine {
void horn() {
System.out.println("beep");
}
}
public class Yard {
public static void main(String[] args) {
Machine t = new Truck();
Machine c = new Car();
t.horn();
c.horn();
}
}
با javac Yard.java ترجمه کنید، بعد java Yard را اجرا کنید. صفحه اول honk بعد beep را نشان میدهد. در این دموی دوم شیء Machine ساده نیست، با این حال هر دو متغیر هنوز typed از نوع Machine هستند. اشیای فرزند بدنهها را میدهند. همان ایدهٔ polymorphism با صفحهٔ کوتاهتر است.
سطرهای اختصاص را یکبار دیگر بخوانید: سمت چپ Machine، سمت راست new Truck() یا new Car(). سمت چپ نوع والدی را نام میبرد که از طریق آن صدا میزنید. سمت راست شیء واقعی را نام میبرد. روی هر دو فرزند extends Machine را نگه دارید تا آن اختصاصها مجاز بمانند.
اگر دموهای abstract هنوز نزدیکاند، بهعنوان تاریخ نگه دارید. برای این درس فایل تدریس polymorphism را اجرا کنید تا صفحه tone / honk / beep یا honk / beep نشان دهد، نه park بهعنوان داستان اصلی. اگر javac از کلاس عمومی تکراری شکایت کرد، فقط Yard را public نگه دارید.
کدام بدنهٔ horn اجرا میشود
📊 Who runs for each Machine variable
| Variable | Real object | horn prints |
|---|---|---|
m |
Machine |
tone |
t |
Truck |
honk |
c |
Car |
beep |
مقایسه با پر کردن abstract
در صفحهٔ abstract، Machine متد horn را ناتمام گذاشت و فرزندها آن را پر کردند، اغلب با park مشترک. در این صفحه Machine از قبل بدنهٔ tone دارد، فرزندها آن را override میکنند، و متغیرهای typed والد اشیاء را نگه میدارند. هنوز Yard.java را ترجمه میکنید و java Yard را اجرا میکنید. توکنهای تازه اختصاصهای typed والد مثل Machine t = new Truck(); و سه چاپ متفاوت از یک نام فراخوانی هستند.
اگر هنوز فایل abstract باز است، ممکن است abstract void horn(); و park ببینید. به فایل polymorphism بروید تا Machine بدنهٔ عادی horn داشته باشد و main متغیرهای Machine را به اشیای متفاوت اختصاص دهد. دموهای equals را از این صفحه بیرون بگذارید. ورودی صفحهکلید را از این صفحه بیرون بگذارید.
قبل از equals
میتوانید متغیرهای Machine را به اشیای Machine، Truck و Car اختصاص دهید و tone، بعد honk، بعد beep را ببینید. میتوانید فقط دو فرزند را بهعنوان ارجاع Machine نگه دارید و honk بعد beep را ببینید. برای هر دموی نگهداشته Yard.java را ترجمه کنید و java Yard را اجرا کنید. فراخوانی مالک بدنه را به کار برد. صفحهٔ بعد equals است، جایی که دو شیء برای یکسانی به شکل امن تدریس مقایسه میشوند.
دموی سه شیء را برای صفحهٔ روشن والد بهعلاوهٔ فرزندها نگه دارید. دموی دو فرزند را برای جفت روشن typed والد نگه دارید. فایلهای equals را از این صفحه بیرون بگذارید. این سه عادت ایست بازرسی قبل از جلو رفتناند. وقتی از متغیر truck با نوع Machine مقدار honk میآید، polymorphism کار این درس را کرده و برای موضوع بعدی دربارهٔ equals آمادهاید.
یکبار آخر پوشه را ببینید: یک Yard عمومی، بدنههای horn والد و فرزند، متغیرهای typed والد در main، بدون انتظار صفحهکلید، بدون اجبار به equals. یکبار دیگر روی دموی باز javac Yard.java و java Yard را اجرا کنید. اگر صفحه هنوز با جدول جور است، فراخوانی چندشکلی محکم است و دوره میتواند در صفحهٔ بعد به equals برود.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود