سه شنبه ۲۷ شهريور ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش سی شارپ - ارث بری

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

در هنگام ایجاد یک کلاس، به جای نوشتن داده‌های عضو و توابع عضو کاملاً جدید، برنامه‌نویس می‌تواند اعلام کند که کلاس جدید باید از داده‌ها و توابع عضو کلاس موجود به عنوان کلاس پایه، بهره‌مند شود. این کلاس موجود، به عنوان کلاس پایه، و کلاس جدید به عنوان کلاس مشتق شده شناخته می‌شود.

ایده ارث بری، رابطه (هست-یک) را پیاده‌سازی می‌کند. به عنوان مثال، سگ هست-یک پستاندار ، پستاندار هست-یک حیوان، لذا سگ نیز هست-یک حیوان است و غیره.

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

یک کلاس می‌تواند از یک کلاس یا رابط (interface) مشتق شود، به این معنا که می‌تواند از داده‌ها و توابع عضو کلاس پایه یا رابط بهره‌مند شود.

ساختار مورد استفاده در 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

مقداردهی اولیه کلاس پایه

کلاس مشتق شده عضو متغیرها و متدهای عضو کلاس پایه را به ارث می‌برد. بنابراین، شیء کلاس اصلی باید قبل از ایجاد زیرکلاس ایجاد شود. شما می‌توانید دستورالعمل‌هایی برای مقداردهی اولیه کلاس اصلی را در لیست مقداردهی عضو بدهید.

برنامه زیر این را نشان می‌دهد −

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#

C# ارث چندگانه را پشتیبانی نمی کند. با این حال، می توانید از رابط ها برای پیاده سازی ارث چندگانه استفاده کنید. برنامه زیر این را نشان می دهد −

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