مسیرها
/
Java
Java
/
تمرین‌ها
/
جادوگران و جنگجویان ۲
جادوگران و جنگجویان ۲

جادوگران و جنگجویان ۲

تمرین یادگیری

مقدمه

سربارگذاری متد

در جاوا، «سربارگذاری متد» قابلیتی است که به یک کلاس اجازه می‌دهد بیش از یک متد با اسم یکسان داشته باشد، به شرطی که فهرست پارامترهایشان متفاوت باشد. این مفهوم با «چندریختی» زمان کامپایل (یا چندریختی ایستا) مرتبط است. این مفهوم برای ساختن متدهایی حیاتی است که کارهای مشابهی را با ورودی‌های متفاوت انجام می‌دهند.

چرا متدها را سربارگذاری کنیم؟

سربارگذاری متد خوانایی برنامه را افزایش می‌دهد. به متدهای متفاوت می‌توان اسم یکسان داد، اما با پارامترهای متفاوت. بسته به تعداد پارامترها یا نوع پارامترها، متد متناظر فراخوانی می‌شود.

چگونه متدها را سربارگذاری کنیم؟

کلید سربارگذاری متد، «امضای متد» است. اگر دو متد امضاهای متفاوتی داشته باشند، متفاوت در نظر گرفته می‌شوند. دو روش برای سربارگذاری یک متد وجود دارد:

  1. تعداد متفاوت پارامترها: متدها می‌توانند اسم یکسان اما تعداد پارامترهای متفاوت داشته باشند.

    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);
        }
    }
    
  2. انواع متفاوت پارامترها: متدها می‌توانند اسم یکسان و تعداد پارامترهای یکسان داشته باشند، اما نوع پارامترهایشان متفاوت باشد.

    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» انجام می‌دهید. شما «استاد بازی» هستید، همان کسی که وظیفه دارد دنیای بازی را برای بازیکنان زنده کند. یک جنبه‌ی کلیدی این کار، توصیف بازی برای بازیکنان است: وضعیت یک شخصیت چیست، شهری که به آن سفر می‌کنند چه شکلی است و غیره.

پنج وظیفه دارید که در آن‌ها بخش‌هایی از بازی را برای بازیکنان توصیف می‌کنید.

1. توصیف یک شخصیت

هر شخصیت یک کلاس، سطح و تعداد امتیاز جان دارد و به این شکل توصیف می‌شود: "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."

2. توصیف یک مقصد

هر مقصد یک اسم و تعدادی ساکن دارد و به این شکل توصیف می‌شود: "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."

3. توصیف روش سفر

شخصیت‌ها می‌توانند با یکی از دو گزینه به مقصدی سفر کنند:

  • پیاده‌روی، به این شکل توصیف می‌شود: "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."

4. توصیف سفر یک شخصیت به یک مقصد

وقتی یک شخصیت به مقصدی سفر می‌کند، این سفر به شکل ترکیبی از توصیف‌های جداگانه توصیف می‌شود: "<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."

5. توصیف سفر یک شخصیت به یک مقصد بدون تعیین روش سفر

در بیشتر موارد، شخصیت‌ها پیاده به مقصد سفر می‌کنند. برای راحتی کار، بازیکنان می‌توانند روش سفرشان را ذکر نکنند. در این صورت فرض می‌شود که پیاده‌روی روش سفر است. متد 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."
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Java Exercism

آماده‌اید جادوگران و جنگجویان ۲ را شروع کنید؟

در Exercism ثبت‌نام کنید تا Java را همراه با 26 مفهوم158 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.