ارث بری در سی شارپ

Inheritance (ارث بری) یکی از کلیدی ترین مفاهیم در برنامه نویسی شی گرا می باشد. از ارث بری می توان به عنوان ابزاری برای جلوگیری از تکرار هنگام تعریف کلاس هایی که دارای قابلیت ها و ویژگی های یکسان می باشند استفاده نمود. برای مثال برنامه یک فروشگاه را در نظر بگیرید که دارای کالاهای مختلفی می باشد. در چنین شرایطی می توان با استفاده از مفهوم ارث بری از تکرار ویژگی های مشترک محصولات در کلاس های مختلف جلوگیری نمود.

نحوه استفاده

هنگامی که می گوییم کلاس A از کلاس B ارث بری دارد، یعنی تمام مشخصات و متدهای public و protected آن را به ارث می برد و نحوه تعریف آن در برنامه سی شارپ به شکل می باشد.

class A:B
{

}

در مثال فوق به A کلاس پایه (Base Class) و به B کلاس مشتق شده (Derived Class) گفته می شود.

مثال: قصد داریم برای یک آموزشگاه برنامه ای بنویسیم که در آن دو موجودیت استاد و دانشجو وجود دارد. در حالت عادی کلاس های مربوط به آنها به شکل زیر خواهد بود.

Student.cs
class Student
{
    int id;
    string name, major;

    public int Id {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }

    }
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    public string Major
    {
        get
        {
            return major;
        }
        set
        {
            major = value;
        }
    }
}
Teacher.cs
class Teacher
{
    int id;
    string name, education;

    public int Id {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }

    }
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
    public string Education
    {
        get
        {
            return education;
        }
        set
        {
            education = value;
        }
    }
}

در این مثال دانشجو و استاد هر دو انسان می باشند و طبیعتاٌ دارای ویژگی های مشترکی از جمله Id و Name هستند که این ویژگی های مشترک در برنامه های واقعی قطعاً بیشتر خواهد بود. حال تصور کنید قصد داشته باشید محدودیتی برای فیلد Name اعمال کنید، این تغییرات باید در دو کلاس انجام شود و هرچه این تعداد بیشتر باشد طبیعتاً توسعه برنامه نیز سخت تر خواهد. برای افزایش کارآیی می توان فیلدهای مشترک را در یک کلاس قرار داد تا دو کلاس دیگر از آن ارث بری داشته باشند.

کدهای کلاس Person

class Person
{
    int id;
    string name;

    public int Id {
        get
        {
            return id;
        }
        set
        {
            id = value;
        }

    }
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
        }
    }
}

کدهای کلاس Student

class Student:Person
{
    string major;

    public string Major
    {
        get
        {
            return major;
        }
        set
        {
            major = value;
        }
    }
    public void ShowInfo()
    {
        Console.WriteLine("Student Info: " + Id+" " + Name + " " + Major);
    }

}

مشاهده می کنید با آنکه فیلدهای Id و Name درون کلاس Student تعریف نشده اند، اما از آنجا که از کلاس Person ارث بری دارند، بنابراین قابل استفاده خواهند بود.

کدهای کلاس Teacher

class Teacher : Person
{
    string education;

    public string Education
    {
        get
        {
            return education;
        }
        set
        {
            education = value;
        }
    }
    public void ShowInfo()
    {
        Console.WriteLine("Teacher Info: " + Id + " " + Name + " " + Education);
    }

}

پس از تعریف کلاس ها می توانید در متد Main می تواند از هریک نمونه ساخته و استفاده نمایید.

static void Main(string[] args)
{
    Teacher t1 = new Teacher();
    t1.Id = 101;
    t1.Name = "Mohamad Sadri";
    t1.Education = "Master";
    t1.ShowInfo();

    Student s1 = new Student();
    s1.Id = 201;
    s1.Name = "Zahra Akbari";
    s1.Major = "Software";
    s1.ShowInfo();

    Console.ReadLine();
}

نکاتی درباره ارث بری

  • در سی شارپ تمامی کلاس ها از کلاس System.Object ارث بری دارند و به عبارتی دیگر این کلاس، پدر همه کلاس ها در سی شارپ می باشد.
  • هنگام ارث بری باید دقت داشته باشید که Circular Reference اتفاق نیفتد. یعنی اگر کلاس A از کلاس B و کلاس B از کلاس C ارث بری داشته باشند، کلاس C نمی تواند از A ارث بری داشته باشد.
  • کلاس های سی شارپ از Multiple Inheritance (ارث بری چندگانه) پشتبیانی نمی کند. یعنی کلاس A نمی تواند بصورت همزمان از کلاسها B, C ارث بری داشته باشد، این قابلیت توسط Interface ها قابل پیاده سازی است.