مقدمه
وراثت (Inheritance) یکی از اصول مهم برنامهنویسی شیگراست و به شما اجازه میدهد یک کلاس جدید بر
پایه کلاس دیگر بسازید. با این ویژگی میتوانید ویژگیها و رفتارهای کلاس والد را بدون تکرار کد، به
کلاس فرزند منتقل کنید و ساختار کد خود را توسعهپذیرتر کنید.
با وراثت، یک کلاس فرزند (Child) میتواند متدها و پراپرتیهای کلاس والد (Parent) را به ارث ببرد و
حتی در صورت نیاز، برخی متدها را بازنویسی (override) کند یا ویژگیهای جدید به آن اضافه کند.
سینتکس extends و super
برای ایجاد وراثت در جاوااسکریپت از کلمه کلیدی extends استفاده میکنیم. اگر کلاس فرزند
سازنده (constructor) خودش را داشته باشد باید با متد super() سازنده
والد را فراخوانی کند.
در مثال زیر کلاس Student از Person ارثبری میکند و متد جدیدی نیز دارد.
JAVASCRIPT
class Person {
constructor(name) {
this.name = name;
}
greet() {
console.log("Hello " + this.name);
}
}
class Student extends Person {
constructor(name, grade) {
super(name);
this.grade = grade;
}
showGrade() {
console.log(this.name + " - " + this.grade);
}
}
let st = new Student("lale", 18);
st.greet();
st.showGrade();
در اینجا کلاس Student با استفاده از extends از Person ارثبری میکند. متد
greet از کلاس والد به
صورت خودکار در Student قابل استفاده است و متد جدید showGrade نیز اضافه شده است.
همچنین با
استفاده از super(name) در سازنده Student، مقدار name به سازنده والد ارسال
میشود.
بازنویسی متد والد
اگر در کلاس فرزند متدی با همان نام متد والد تعریف کنید، نسخه جدید جایگزین متد والد میشود. با
کلمه super میتوانید همچنان به متد والد دسترسی داشته باشید. مثال زیر را ببینید.
JAVASCRIPT
class Animal {
speak() {
console.log("animal sound");
}
}
class Dog extends Animal {
speak() {
super.speak();
console.log("bow-wow");
}
}
let dog = new Dog();
dog.speak();
در اینجا متد speak در کلاس Dog بازنویسی شده است. ابتدا با استفاده از
super.speak() متد والد اجرا
میشود و سپس پیام جدید ("bow-wow") چاپ میگردد. بنابراین خروجی کد بالا به صورت زیر خواهد بود:
animal sound
bow-wow
زنجیره وراثت و instanceof
در جاوااسکریپت میتوانید چند سطح وراثت داشته باشید و کلاسهای فرزند، خودشان هم والد شوند. با
عملگر instanceof هم میتوانید بررسی کنید یک شیء نمونه کدام کلاس است.
در مثال زیر کلاس Teacher از Person و SpecialTeacher از Teacher
ارثبری میکند.
JAVASCRIPT
class Teacher extends Person {}
class SpecialTeacher extends Teacher {}
let t = new SpecialTeacher("Reza");
console.log(t instanceof SpecialTeacher);
console.log(t instanceof Teacher);
console.log(t instanceof Person);
در این مثال، شیء t که از کلاس SpecialTeacher ساخته شده است، همزمان نمونهای از SpecialTeacher،
Teacher و Person محسوب میشود. این به دلیل زنجیره وراثت است که باعث میشود
ویژگیها و متدهای
کلاسهای والد برای کلاسهای فرزند نیز قابل دسترسی باشد.
وراثت کلاسها ساختار کد شما را منظمتر، قابل نگهداریتر و توسعهپذیرتر میکند. با این قابلیت
میتوانید منطق مشترک را در کلاسهای والد تعریف کنید و کلاسهای فرزند را با ویژگیهای جدید گسترش
دهید. در درس بعدی در مورد یک مفهوم بسیار کلیدی دیگر در ارتباط با شیگرایی
صحبت خواهیم کرد: متدها و پراپرتیهای استاتیک.