مفهوم وراثت (Inheritance) در C#

10 تیر 1396
درسنامه درس 11 از سری آموزش سی شارپ (C#)
csharp-inheritance

با مطالعه‌ی فصل ۹ و ۱۰ با مفهوم شیءگرایی و همچنین کلاس‌ها آشنا شدید. در انتهای فصل ۹ اشاره‌ای به ارث‌بری داشتیم و یک فضای کلی از آن را در اختیار شما قرار دادیم. حال در این بخش می‌خواهیم با جزئیات بیشتری این مفهوم را بررسی کرده و مثال‌های کاربردی ارائه دهیم. با ما همراه باشید.

مقدمه

همانطور که قبلا هم ذکر کردیم ارث‌بری به عنوان مهم‌ترین مفهوم در برنامه‌نویسی شیءگرا مطرح می‌شود. با استفاده از آن می‌توان کلاسی را تعریف کرد که برخی از خصوصیات و رفتارهای کلاس‌های دیگر را به ارث ببرد. این کار نگه‌داری و تولید نرم‌افزار شما را بسیار ساده‌تر می‌کند. همچنین باعث می‌شود از توابع استفاده کرده و سرعت برنامه‌نویسی و اجرا پروژه خود را بالا ببرید. اگر کلاس ‌B از کلاس A به ارث ببرد به اصلاح می‌گویند که کلاس B از کلاس A مشتق شده است.

کلاس‌های پایه و مشتق شده

یک کلاس می‌تواند از یک یا چند کلاس یا واسط نشات گرفته شود. بدین معنی که یک کلاس می‌تواند متغییرها و متدها را از چندین کلاس یا واسط به ارث ببرد.

در زبان برنامه‌نویسی #C برای نمایش کلاس‌های به ارث برده شده از علامت : (دو نقطه) استفاده می‌شود. به مثال زیر توجه کنید:

<acess-specifier> class <base_class>
{
   ...
}
class <derived_class> : <base_class>
{
   ...
}

همانطور که ملاحظه می‌کنید کلاس derived_class از کلاس base_class مشتق شده است. برای روشن‌تر شدن این موضوع یک کلاس Shape و یک کلاس مشتق شده از آن به نام Rectangle را در نظر بگیرید:

using System;
namespace InheritanceApplication
{
   class Shape 
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // Derived class
   class Rectangle: Shape
   {
      public int getArea()
      { 
         return (width * height); 
      }
   }
   
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // Print the area of the object.
         Console.WriteLine("Total area: {0}",  Rect.getArea());
         Console.ReadKey();
      }
   }
}

با بررسی این مثال می‌توان دریافت که دو متغییر به نام width و height از نوع int بوده و سطح دسترسی آنها protected (یعنی قابل استفاده در کلاس‌هایی که از آن به ارث برده‌اند) است. حال در کلاس دیگری به نام Rectangle با استفاده از علامت دو نقطه (:) کلاس اصلی که از آن ارث برده است را مشخص کرده ایم و اسم این کلاس Shape می‌باشد. سپس یک تابع درون آن تعریف کرده و محیط مستطیل را محاسبه می‌کنیم. اگر وارد بخش متد اصلی برنامه یعنی Main برنامه شوید متوجه خواهید شد علیرغم اینکه یک شیء از کلاس Rectangle ساخته شده است، می‌توان به سایر متدهای موجود در کلاس اصلی یعنی Shape دسترسی داشت. در نهایت خروجی این مثال به صورت زیر خواهد بود:

Total area: 35

مقداردهی اولیه کلاس والد (اصلی)

می‌توان کلاس اصلی یا والد را مقداردهی اولیه کرد و یک سازنده برای آن تعریف نمود. در این صورت می‌توان به هنگام ارث بری از کلاس بالاتر سازنده آن را نیز ارث برده و به سازنده کلاس فرزند متصل کرد. برای اینکار باید در سازنده فرزند از عبارت base: استفاده کرد. به مثال زیر توجه کنید:

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      //member variables
      protected double length;
      protected double width;
      public Rectangle(double l, double w)
      {
         length = l;
         width = w;
      }
      
      public double GetArea()
      {
         return length * width;
      }
      
      public void Display()
      {
         Console.WriteLine("Length: {0}", length);
         Console.WriteLine("Width: {0}", width);
         Console.WriteLine("Area: {0}", GetArea());
      }
   }//end class Rectangle  
   
   class Tabletop : Rectangle
   {
      private double cost;
      public Tabletop(double l, double w) : base(l, w)
      { }
      public double GetCost()
      {
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display()
      {
         base.Display();
         Console.WriteLine("Cost: {0}", GetCost());
      }
   }
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Tabletop t = new Tabletop(4.5, 7.5);
         t.Display();
         Console.ReadLine();
      }
   }
}

خروجی این مثال به صورت زیر می‌باشد:

Length: 4.5
Width: 7.5
Area: 33.75
Cost: 2362.5

این فصل به اتمام رسید و در نهایت شما با مفهوم وراثت آشنایی کامل پیدا کردید. در فصل بعدی به توضیح مفصلی درباره پلی مورفیسم می‌پردازیم. با ما همراه باشید.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.