سی شارپ - وراثت

یکی از مهم ترین مفاهیم در برنامه نویسی شی گرا inheritance. است، در واقع inheritance به ما اجازه می دهد تا یک کلاس را در با استفاده ازکلاس دیگری تعریف کنیم که این قابلیت ایجاد و اجرای یک برنامه را آسان تر می کند. همچنین این فرصت را فراهم می کند تا امکان استفاده ی مجدد از کد را فراهم کرده و زمان توسعه ی یک برنامه را کاهش بدهیم

در هنگام ایجاد یک کلاس به جای ایجاد همه ی اعضای جدید و توابع عضو، برنامه نویس می تواند تعیین کند که بعضی از این مشخصات و توابع از کلاس دیگری ارث بری شوند به این کلاس موجود ، کلاس پایه یا (base class) می گوییم و به کلاس جدید به کلاس فرزند یا مشتق(derived class) می گوییم

نظریه ی وراثت در واقع IS-A را پیاده سازی می کند. به عنوان مثال mammal IS A animal , dog IS-A mamal hence dog IS-A animal و به غیره.

کلاس های base و Derived

یک کلاس می تواند از بیشتر ازیک کلاس یا اینترفیس مشتق شود که بدین معناست که می تواند داده و توابع را از چند کلاس پایه و اینترفیس ارث بری کند.

ترکیب استفاده شده برای ایجاد کلاس های derived در C# مانند زیر می باشد.

<acess-specifier> class <base_class>
{
   ...
}
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();
      }
   }
}

نتیجه ی اجرای کد بالا به شکل زیر خواهد بود

Total area: 35

Initializie کردن کلاس پایه

کلاس مشتق شده (derived class) متغیرهای عضو کلاس اصلی و متدهای عضو را به ارث می برد. بنابراین کلاس پایه (super class) باید قبل ازایجاد کلاس فرزند، ایجاد شود. شما می توانید دستوراتی برای کلاس پایه initialization در لیست فرزند initialization بدهید.

کد زیر این مطلب را توضیح می دهد

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

ارث بری چند گانه در سی شارپ

multiple inheritance در سی شارپ پشتیبانی نمی شود.ولی می توانید از اینترفیس هایی برای اجرای multiple inheritance استفاده کنید.

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;
   }

   // Base class PaintCost
   public interface PaintCost 
   {
      int getCost(int area);

   }
   
   // Derived class
   class Rectangle : Shape, PaintCost
   {
      public int getArea()
      {
         return (width * height);
      }
      public int getCost(int area)
      {
         return area * 70;
      }
   }
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();
         int area;
         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();
         
         // Print the area of the object.
         Console.WriteLine("Total area: {0}",  Rect.getArea());
         Console.WriteLine("Total paint cost: ${0}" , Rect.getCost(area));
         Console.ReadKey();
      }
   }
}

حاصل اجرای قطعه کد بالا به صورت زیر است

Total area: 35
Total paint cost: $2450