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

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

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

مقدمه

وراثت

«وراثت» یکی از مفاهیم اصلی «برنامه‌نویسی شیءگرا» است. این مفهوم نشان‌دهنده‌ی یک رابطه‌ی «هست-یک» است. معنای آن در برنامه‌نویسی دقیقاً همان معنایی است که در انگلیسی دارد: به ارث بردن ویژگی‌ها از «والد» (در برنامه‌نویسی، ویژگی‌ها معمولاً «توابع» و «متغیرها» هستند).

یک «کلاس» به نام Animal را در نظر بگیرید، همان‌طور که نشان داده شده است:

//Creating an Animal class with bark() as a member function.
public class Animal {

    public void bark() {
        System.out.println("This is an animal");
    }

}

Animal یک کلاس والد است، چون ویژگی‌های این کلاس می‌توانند به همه‌ی حیوانات تعمیم یابند.

حیوانی به نام Lion را در نظر بگیرید که کلاسی به این شکل دارد:

//Lion class is a child class of Animal.
public class Lion extends Animal {

    @Override
    public void bark() {
        System.out.println("Lion here!!");
    }

}
Note

از «حاشیه‌نویسی» Override برای این استفاده می‌شود که نشان دهد «متد»ی در یک «زیرکلاس»، «متد»ی از «ابرکلاس» را بازنویسی می‌کند. استفاده از آن اکیداً ضروری نیست، اما یک رویه‌ی خوب است.

حالا هر زمان که این کار را انجام می‌دهیم:

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

توجه: کلاس Animal را با Lion نمونه‌سازی می‌کنیم. خروجی به این شکل خواهد بود:

Lion here!!

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

دستورالعمل‌ها

در این تمرین شما یک بازی نقش‌آفرینی انجام می‌دهید که در آن انواع مختلف مبارزان می‌توانند با یکدیگر بجنگند. بازی برای هر نوع مبارز قوانین متفاوتی دارد. ما روی دو نوع خاص تمرکز می‌کنیم: Wizard و Warrior.

قوانین مربوط به Warrior به این صورت است:

  • یک Warrior هرگز آسیب‌پذیر نیست.
  • یک Warrior اگر مبارزی که به آن حمله می‌کند آسیب‌پذیر نباشد، 6 واحد آسیب وارد می‌کند.
  • یک Warrior اگر مبارزی که به آن حمله می‌کند آسیب‌پذیر باشد، 10 واحد آسیب وارد می‌کند.

قوانین مربوط به Wizard به این صورت است:

  • یک Wizard می‌تواند از قبل طلسمی آماده کند.
  • یک Wizard آسیب‌پذیر است، مگر اینکه از قبل طلسمی آماده کرده باشد.
  • یک Wizard اگر از قبل طلسمی آماده کرده باشد، 12 واحد آسیب وارد می‌کند.
  • یک Wizard اگر از قبل طلسمی آماده نکرده باشد، 3 واحد آسیب وارد می‌کند.

1. کلاس Warrior را بسازید

یک کلاس جدید به اسم Warrior بسازید. این کلاس باید از کلاس موجود Fighter ارث‌بری کند.

2. توصیف Warrior

کلاس Warrior را طوری به‌روزرسانی کنید که متد toString() آن توصیف کند که این مبارز از چه نوعی است. این متد باید رشته‌ی "Fighter is a Warrior" را برگرداند.

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. Warriorها را آسیب‌ناپذیر کنید

کلاس Warrior را طوری به‌روزرسانی کنید که متد isVulnerable() آن همیشه false را برگرداند.

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. محاسبه‌ی واحدهای آسیب یک Warrior

کلاس Warrior را طوری به‌روزرسانی کنید که متد getDamagePoints(Fighter) آن، آسیبی را که یک Warrior طبق قوانین بالا وارد می‌کند محاسبه کند.

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. کلاس Wizard را بسازید

یک کلاس جدید دیگر به اسم Wizard بسازید. این کلاس هم باید از کلاس موجود Fighter ارث‌بری کند.

6. توصیف Wizard

کلاس Wizard را طوری به‌روزرسانی کنید که متد toString() آن توصیف کند که این مبارز از چه نوعی است. این متد باید رشته‌ی "Fighter is a Wizard" را برگرداند.

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. به Wizardها اجازه دهید طلسم آماده کنند و اگر طلسمی آماده نکرده‌اند، آسیب‌پذیر باشند

کلاس Wizard را به‌روزرسانی کنید و متدی به اسم prepareSpell() به آن اضافه کنید. این کلاس باید به خاطر بسپارد که چه زمانی این متد فراخوانی شده است و مطمئن شود که متد isVulnerable() آن فقط وقتی طلسمی آماده شده باشد false را برمی‌گرداند.

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. محاسبه‌ی واحدهای آسیب یک Wizard

کلاس Wizard را طوری به‌روزرسانی کنید که متد getDamagePoints(Fighter) آن، آسیبی را که یک Wizard طبق قوانین بالا وارد می‌کند محاسبه کند.

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Java Exercism

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

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