ارثبری (Inheritance):
ارثبری یکی دیگر از ارکان اصلی برنامهنویسی شیءگرا است
که به ما اجازه میدهد یک کلاس جدید را بر اساس یک کلاس موجود ایجاد کنیم. این
مفهوم شبیه ارث بردن ویژگیها از والدین در دنیای واقعی است. مثلاً همانطور که
فرزندان برخی خصوصیات را از والدین خود به ارث میبرند، در برنامهنویسی هم یک
کلاس میتواند ویژگیها و رفتارهای کلاس دیگر را به ارث ببرد.
هدف ارثبری در سیشارپ:
چه زمانی از ارثبری استفاده کنیم؟
نحوه پیادهسازی ارثبری در سیشارپ:
در سیشارپ، از علامت دو
نقطه (:) برای نشان دادن ارثبری استفاده میکنیم. کلاسی که ارث میبرد را کلاس
فرزند یا مشتق شده، و کلاسی که از آن ارث برده میشود را کلاس والد یا پایه مینامیم.
مثال عملی: حیوانات
فرض کنید میخواهیم
سیستمی برای مدیریت حیوانات ایجاد کنیم:
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public virtual void MakeSound()
{
Console.WriteLine("حیوان صدا میکند");
}
}
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("سگ پارس میکند");
}
public void Fetch()
{
Console.WriteLine("سگ توپ را میآورد");
}
}
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("گربه میو میو میکند");
}
public void Scratch()
{
Console.WriteLine("گربه چنگ میزند");
}
}
در این مثال، Dog و Cat از Animal ارث میبرند. آنها Name و Age را به ارث میبرند و متد MakeSound را بازنویسی میکنند. همچنین هر کدام متد خاص خود را دارند.
ارثبری به ما کمک میکند تا کد تمیزتر، قابل استفاده مجدد و ساختاریافتهتری بنویسیم. این مفهوم یکی از ابزارهای قدرتمند در طراحی و پیادهسازی سیستمهای نرمافزاری پیچیده است.
در سی شارپ می توان فیلدها یا پروپرتی ها و متدها را از یک کلاس دیگر نیز به ارث برد . به این رفتار (Inheritance) یا ارث بری می گویند در مفهوم "ارث بری" با دودسته مواجه می شویم .
دسته اول کلاس های پایه یا والد که به (Base Class) یا (Parent) نام گذاری شده اند: کلاس های دیگر از این نوع کلاس ارث می برند.
دسته دوم کلاس های نشأت گرفته شده یا فرزند که به (Derived Class) یا (child) نام گذاری شده اند: این نوع کلاس ها از کلاس نوع اول ارث می برد. برای ارث بری از یک کلاس از علامت (:) استفاده می کنیم.
در مثال پایین کلاس "ماشین" (Car) تمام فیلدها و متدها را از کلاس "وسیله نقلیه" (Vehicle) ارث می برد.
class Vehicle // base class (parent)
{
public string brand = "Ford"; // Vehicle field
public void honk() // Vehicle method
{
Console.WriteLine("Tuut, tuut!");
}
}
class Car : Vehicle // derived class (child)
{
public string modelName = "Mustang"; // Car field
}
class Program
{
static void Main(string[] args)
{
ساخت یک شی از کلاس car //
Car myCar = new Car();
صدا زدن متد هونک از کلاس ویسل بوسیله شی یا نمونه ای از کلاس car //
myCar.honk();
نمایش محتوای فیلد brand (از کلاس ویسل)و محتوای (modelName) از کلاس Car //
Console.WriteLine(myCar.brand + " " + myCar.modelName);
}
}
استفاده از ارث بری بخاطر استفاده مجدد از فیلدها و متدهایی است که ما قبلا در کلاس های دیگر نوشته ایم.
اگر ما نخواهیم کلاس های دیگر از یک کلاس ما ارث بری داشته باشند ما باید کلاسمان را بصورت مهر و موم شده (sealed) اعلان کنیم .
اگر کسی سعی کند از یک کلاس (sealed) ارث بری داشته باشد با پیام خطا مواجه می شود.
در مثال پایین کلاس (Car) نمی تواند از کلاس (Vehicle) ارث بری داشته باشد. و در صورت انجام این کار با پیام خطا مواجه می شود
sealedclass
Vehicle
{
...
}
classCar
:
Vehicle
{
...
}