در دارت، ارثبری (Inheritance) یکی از مفاهیم اساسی برنامهنویسی شیءگرا است. این ویژگی به شما اجازه میدهد که ویژگیها و رفتارهای یک کلاس (کلاس والد) را در کلاسهای دیگر (کلاسهای فرزند) به ارث ببرید. ارثبری به شما این امکان را میدهد که کدهای تکراری را کاهش دهید و از پیادهسازی مجدد ویژگیها و متدهای مشابه جلوگیری کنید.
نحوه ارثبری در دارت
در دارت برای ارثبری از کلمه کلیدی extends
استفاده میشود. با استفاده از این کلمه، یک کلاس میتواند از یک کلاس دیگر ارثبری کند و ویژگیها و رفتارهای آن کلاس را به ارث ببرد.
ساختار پایه ارثبری در دارت
در این مثال، در اینجا خودروهای کلاس مادر و تویوتا کلاس فرزند هستند. کلاس تویوتا ویژگی ها و روش های کلاس خودرو را به ارث می برد.

مثال ساده از ارثبری:
فرض کنید یک کلاس Animal
داریم که ویژگیهایی مانند نام و سن را دارد، و سپس یک کلاس Dog
داریم که از کلاس Animal
ارثبری میکند و ویژگیهای خاص خود را اضافه میکند.
dartCopy// کلاس والد
class Animal {
String name;
int age;
Animal(this.name, this.age); // سازنده کلاس والد
void speak() {
print('$name is making a sound');
}
}
// کلاس فرزند که از Animal ارث میبرد
class Dog extends Animal {
String breed;
Dog(String name, int age, this.breed) : super(name, age); // فراخوانی سازنده کلاس والد
@override
void speak() {
print('$name says Woof!');
}
}
void main() {
var dog = Dog('Buddy', 3, 'Golden Retriever');
print('${dog.name} is ${dog.age} years old and is a ${dog.breed}');
dog.speak(); // خروجی: Buddy says Woof!
}
توضیحات:
- کلاس والد (
Animal
):- شامل دو فیلد
name
وage
است. - یک متد
speak()
دارد که برای چاپ صدای حیوانات به کار میرود.
- شامل دو فیلد
- کلاس فرزند (
Dog
):- از کلاس
Animal
ارث میبرد. - یک ویژگی جدید به نام
breed
(نوع سگ) اضافه میکند. - از
super(name, age)
برای فراخوانی سازنده کلاس والد استفاده میشود تا فیلدهایname
وage
را مقداردهی کند. - متد
speak()
را override میکند تا صدای سگ را چاپ کند.
- از کلاس
- استفاده از
@override
:- زمانی که متدی در کلاس فرزند میخواهیم که همان نام متد در کلاس والد داشته باشد، از
@override
استفاده میکنیم. این نشاندهنده این است که ما متد را در کلاس فرزند بازنویسی (Override) کردهایم.
- زمانی که متدی در کلاس فرزند میخواهیم که همان نام متد در کلاس والد داشته باشد، از
نکات مهم در ارثبری:
- سازندهها: سازندههای کلاس والد به طور خودکار به کلاس فرزند ارث نمیرسند، اما میتوانیم در کلاس فرزند از
super
برای فراخوانی سازندههای والد استفاده کنیم. - محدودیتها: دارت فقط از یک ارثبری (single inheritance) پشتیبانی میکند. یعنی یک کلاس میتواند تنها از یک کلاس والد ارث ببرد.
- متدهای ارثبری: کلاس فرزند تمام متدهای عمومی کلاس والد را به ارث میبرد و میتواند آنها را استفاده یا بازنویسی کند.
مثال با سازنده و متدهای مختلف:
class Vehicle {
String brand;
Vehicle(this.brand);
void start() {
print('The $brand vehicle is starting');
}
}
class Car extends Vehicle {
int wheels;
Car(String brand, this.wheels) : super(brand);
@override
void start() {
print('The $brand car with $wheels wheels is starting');
}
}
void main() {
var car = Car('Toyota', 4);
car.start(); // خروجی: The Toyota car with 4 wheels is starting
}
در این مثال، کلاس Car
از کلاس Vehicle
ارث میبرد و متد start()
را در کلاس فرزند بازنویسی کرده است.
مزایای ارثبری:
- کاهش کد تکراری: با استفاده از ارثبری، میتوانید ویژگیها و متدهای مشترک را در یک کلاس والد تعریف کنید و در کلاسهای فرزند آنها را به ارث ببرید.
- سازگاری: اگر نیاز به تغییراتی در رفتار کلاسها داشته باشید، میتوانید آنها را در کلاس والد تغییر دهید و این تغییرات در تمام کلاسهای فرزند بهطور خودکار اعمال میشود.
- انعطافپذیری: میتوانید رفتار کلاسهای فرزند را با استفاده از متدهای
override
به دلخواه تغییر دهید.
در نهایت، ارثبری یک ابزار قدرتمند برای ساختاردهی و بهینهسازی کد در زبانهای برنامهنویسی شیءگرا مانند دارت است.