در جاوا، «سربارگذاری متد» قابلیتی است که به یک کلاس اجازه میدهد بیش از یک متد با اسم یکسان داشته باشد، به شرطی که فهرست پارامترهایشان متفاوت باشد. این مفهوم با «چندریختی» زمان کامپایل (یا چندریختی ایستا) مرتبط است. این مفهوم برای ساختن متدهایی حیاتی است که کارهای مشابهی را با ورودیهای متفاوت انجام میدهند.
سربارگذاری متد خوانایی برنامه را افزایش میدهد. به متدهای متفاوت میتوان اسم یکسان داد، اما با پارامترهای متفاوت. بسته به تعداد پارامترها یا نوع پارامترها، متد متناظر فراخوانی میشود.
کلید سربارگذاری متد، «امضای متد» است. اگر دو متد امضاهای متفاوتی داشته باشند، متفاوت در نظر گرفته میشوند. دو روش برای سربارگذاری یک متد وجود دارد:
تعداد متفاوت پارامترها: متدها میتوانند اسم یکسان اما تعداد پارامترهای متفاوت داشته باشند.
public class Display {
public void show(int x) {
System.out.println("Show with int: " + x);
}
public void show(int x, int y) {
System.out.println("Show with two ints: " + x + ", " + y);
}
}
انواع متفاوت پارامترها: متدها میتوانند اسم یکسان و تعداد پارامترهای یکسان داشته باشند، اما نوع پارامترهایشان متفاوت باشد.
public class Display {
public void show(int x) {
System.out.println("Show with int: " + x);
}
public void show(String s) {
System.out.println("Show with String: " + s);
}
}
در این مفهوم، نمونهها و ظرافتهای گوناگون سربارگذاری متد در جاوا را بررسی خواهیم کرد.
در این تمرین، شما همراه با بهترین دوستانتان یک بازی نقشآفرینی به نام «Wizard and Warriors» انجام میدهید. شما «استاد بازی» هستید، همان کسی که وظیفه دارد دنیای بازی را برای بازیکنان زنده کند. یک جنبهی کلیدی این کار، توصیف بازی برای بازیکنان است: وضعیت یک شخصیت چیست، شهری که به آن سفر میکنند چه شکلی است و غیره.
پنج وظیفه دارید که در آنها بخشهایی از بازی را برای بازیکنان توصیف میکنید.
هر شخصیت یک کلاس، سطح و تعداد امتیاز جان دارد و به این شکل توصیف میشود: "You're a level <LEVEL> <CLASS> with <HIT_POINTS> hit points.".
متد GameMaster.describe را پیادهسازی کنید که یک Character را به عنوان تنها پارامترش میگیرد و توصیف آن را برمیگرداند.
Character character = new Character();
character.setCharacterClass("Wizard");
character.setLevel(4);
character.setHitPoints(28);
new GameMaster().describe(character);
// => "You're a level 4 Wizard with 28 hit points."
هر مقصد یک اسم و تعدادی ساکن دارد و به این شکل توصیف میشود: "You've arrived at <NAME>, which has <INHABITANTS> inhabitants.".
متد GameMaster.describe را پیادهسازی کنید که یک Destination را به عنوان تنها پارامترش میگیرد و توصیف آن را برمیگرداند.
Destination destination = new Destination();
destination.setName("Muros");
destination.setInhabitants(732);
new GameMaster().describe(destination);
// => "You've arrived at Muros, which has 732 inhabitants."
شخصیتها میتوانند با یکی از دو گزینه به مقصدی سفر کنند:
"You're traveling to your destination by walking."
"You're traveling to your destination on horseback."
متد GameMaster.describe را پیادهسازی کنید که یک TravelMethod را به عنوان تنها پارامترش میگیرد و توصیف آن را برمیگرداند.
new GameMaster().describe(TravelMethod.HORSEBACK);
// => "You're traveling to your destination on horseback."
وقتی یک شخصیت به مقصدی سفر میکند، این سفر به شکل ترکیبی از توصیفهای جداگانه توصیف میشود: "<CHARACTER> <TRAVEL_METHOD> <DESTINATION>".
متد GameMaster.describe را پیادهسازی کنید که یک Character، یک Destination و یک TravelMethod را به عنوان پارامترهایش میگیرد و توصیف آن را برمیگرداند.
Character character = new Character();
character.setCharacterClass("Wizard");
character.setLevel(4);
character.setHitPoints(28);
Destination destination = new Destination();
destination.setName("Muros");
destination.setInhabitants(732);
new GameMaster().describe(character, destination, TravelMethod.HORSEBACK);
// => "You're a level 4 Wizard with 28 hit points. You're traveling to your destination on horseback. You've arrived at Muros, which has 732 inhabitants."
در بیشتر موارد، شخصیتها پیاده به مقصد سفر میکنند.
برای راحتی کار، بازیکنان میتوانند روش سفرشان را ذکر نکنند. در این صورت فرض میشود که پیادهروی روش سفر است.
متد GameMaster.describe را پیادهسازی کنید که یک Character و یک Destination را به عنوان پارامترهایش میگیرد و توصیف آن را برمیگرداند.
Character character = new Character();
character.setCharacterClass("Wizard");
character.setLevel(4);
character.setHitPoints(28);
Destination destination = new Destination();
destination.setName("Muros");
destination.setInhabitants(732);
new GameMaster().describe(character, destination);
// => "You're a level 4 Wizard with 28 hit points. You're traveling to your destination by walking. You've arrived at Muros, which has 732 inhabitants."