«وراثت» یکی از مفاهیم اصلی «برنامهنویسی شیءگرا» است. این مفهوم نشاندهندهی یک رابطهی «هست-یک» است. معنای آن در برنامهنویسی دقیقاً همان معنایی است که در انگلیسی دارد: به ارث بردن ویژگیها از «والد» (در برنامهنویسی، ویژگیها معمولاً «توابع» و «متغیرها» هستند).
یک «کلاس» به نام 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!!");
}
}
از «حاشیهنویسی» Override برای این استفاده میشود که نشان دهد «متد»ی در یک «زیرکلاس»، «متد»ی از «ابرکلاس» را بازنویسی میکند.
استفاده از آن اکیداً ضروری نیست، اما یک رویهی خوب است.
حالا هر زمان که این کار را انجام میدهیم:
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
توجه: کلاس Animal را با Lion نمونهسازی میکنیم.
خروجی به این شکل خواهد بود:
Lion here!!
بر اساس برنامهنویسی شیءگرا، انواع مختلفی از وراثت وجود دارد، اما Java فقط از برخی از آنها پشتیبانی میکند («چندسطحی» و «سلسلهمراتبی»). برای مطالعهی بیشتر دربارهی آن، لطفاً این مطلب را بخوانید.
در این تمرین شما یک بازی نقشآفرینی انجام میدهید که در آن انواع مختلف مبارزان میتوانند با یکدیگر بجنگند. بازی برای هر نوع مبارز قوانین متفاوتی دارد. ما روی دو نوع خاص تمرکز میکنیم: Wizard و Warrior.
قوانین مربوط به Warrior به این صورت است:
6 واحد آسیب وارد میکند.10 واحد آسیب وارد میکند.قوانین مربوط به Wizard به این صورت است:
12 واحد آسیب وارد میکند.3 واحد آسیب وارد میکند.یک کلاس جدید به اسم Warrior بسازید.
این کلاس باید از کلاس موجود Fighter ارثبری کند.
کلاس Warrior را طوری بهروزرسانی کنید که متد toString() آن توصیف کند که این مبارز از چه نوعی است.
این متد باید رشتهی "Fighter is a Warrior" را برگرداند.
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
کلاس Warrior را طوری بهروزرسانی کنید که متد isVulnerable() آن همیشه false را برگرداند.
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
کلاس Warrior را طوری بهروزرسانی کنید که متد getDamagePoints(Fighter) آن، آسیبی را که یک Warrior طبق قوانین بالا وارد میکند محاسبه کند.
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
یک کلاس جدید دیگر به اسم Wizard بسازید.
این کلاس هم باید از کلاس موجود Fighter ارثبری کند.
کلاس Wizard را طوری بهروزرسانی کنید که متد toString() آن توصیف کند که این مبارز از چه نوعی است.
این متد باید رشتهی "Fighter is a Wizard" را برگرداند.
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
کلاس Wizard را بهروزرسانی کنید و متدی به اسم prepareSpell() به آن اضافه کنید.
این کلاس باید به خاطر بسپارد که چه زمانی این متد فراخوانی شده است و مطمئن شود که متد isVulnerable() آن فقط وقتی طلسمی آماده شده باشد false را برمیگرداند.
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
کلاس Wizard را طوری بهروزرسانی کنید که متد getDamagePoints(Fighter) آن، آسیبی را که یک Wizard طبق قوانین بالا وارد میکند محاسبه کند.
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12