C# – وراثت (Inheritance)
وراثت در C#
وراثت یکی از مهمترین مفاهیم در برنامهنویسی شیءگرا است. وراثت به ما اجازه میدهد که یک کلاس را بر اساس کلاس دیگری تعریف کنیم، که این امر به توسعه و نگهداری آسانتر یک برنامه کمک میکند. همچنین این قابلیت به ما امکان استفاده مجدد از کد و افزایش سرعت پیادهسازی را میدهد.
هنگام ایجاد یک کلاس، به جای نوشتن اعضای دادهای و توابع کاملاً جدید، برنامهنویس میتواند مشخص کند که کلاس جدید اعضای یک کلاس موجود را به ارث ببرد. این کلاس موجود به عنوان کلاس پایه و کلاس جدید به عنوان کلاس مشتق نامیده میشود.
کلاس پایه و کلاس مشتق (Base and Derived Classes)
یک کلاس میتواند از بیش از یک کلاس یا اینترفیس مشتق شود، به این معنی که میتواند دادهها و توابع را از چندین کلاس پایه یا اینترفیسها به ارث ببرد.
نحوه ایجاد کلاسهای مشتق در C# به شکل زیر است:
<acess-specifier> class <base_class> {
...
}
class <derived_class> : <base_class> {
...
}
مثال
کلاسی به نام Shape
(شکل) را در نظر بگیرید که به عنوان کلاس پایه استفاده میشود و کلاس Rectangle
(مستطیل) که از Shape
مشتق شده است:
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;
}
// کلاس مشتق
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);
// محاسبه و چاپ مساحت
Console.WriteLine("Total area: {0}", Rect.getArea());
Console.ReadKey();
}
}
}
خروجی:
Total area: 35
مقداردهی اولیه کلاس پایه
کلاس مشتق اعضای متغیر و متدهای کلاس پایه را به ارث میبرد. بنابراین شیء کلاس پایه باید قبل از ایجاد شیء کلاس مشتق ساخته شود. شما میتوانید دستورالعملهایی برای مقداردهی اولیه کلاس پایه در لیست مقداردهی عضوها فراهم کنید.
مثال:
using System;
namespace RectangleApplication {
class Rectangle {
// متغیرهای عضو
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());
}
}
// کلاس مشتق
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;
}
// کلاس پایه PaintCost
public interface PaintCost {
int getCost(int area);
}
// کلاس مشتق
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();
// محاسبه و چاپ مساحت
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
چرا و چه زمانی از "وراثت" استفاده کنیم؟
- وراثت برای استفاده مجدد از کد بسیار مفید است: از اعضای متغیر و متدهای یک کلاس موجود میتوانید هنگام ایجاد یک کلاس جدید استفاده کنید.
نکته: همچنین نگاهی به فصل بعدی، چندریختی (Polymorphism) بیندازید که از متدهای به ارث برده شده برای انجام کارهای مختلف استفاده میکند.
کلیدواژه sealed
اگر نمیخواهید سایر کلاسها از یک کلاس ارثبری کنند، از کلیدواژه sealed
استفاده کنید:
اگر سعی کنید به یک کلاس sealed
دسترسی پیدا کنید، C# خطا تولید خواهد کرد:
sealed class Vehicle
{
...
}
class Car : Vehicle
{
...
}
پیام خطا چیزی شبیه به این خواهد بود:
'Car': cannot derive from sealed type 'Vehicle'
برای ارسال نظر لطفا ابتدا وارد حساب کاربری خود شوید. صفحه ورود و ثبت نام