در زبان برنامهنویسی سی سارپ, کلاس abstract یکی از مفاهیم اساسی و بسیار مهم است. این نوع کلاسها به منظور تعریف یک ساختار برای کلاسهایی که میخواهند از آن ارث بری کنند، استفاده میشوند.
در کتاب 'C# 7.0 in a Nutshell'، جوزف آلباهاری در مورد کلاس abstract میگوید: 'کلاس abstract یک ساختار کلی است که میتواند توسط کلاسهای دیگری که از آن ارث بری میکنند، پیادهسازی شود.
در کتاب 'Pro C# 5.0 and the .NET 4.5 Framework'، اندرو ترولسن در مورد استفاده از کلاس abstract میگوید: 'با استفاده از کلاس abstract، میتوانیم ساختار کلیای برای یک مجموعه از کلاسها ایجاد کنیم و از کد تکراری جلوگیری کنیم.
در کتاب 'Essential C# 6.0'، مارک مایکلیس در مورد محدودیتهای کلاس abstract میگوید: 'شما نمیتوانید یک نمونه از یک کلاس abstract ایجاد کنید. این کلاسها باید توسط کلاسهایی که از آنها ارث بری میکنند، پیادهسازی شوند.
تعریف کلاس abstract
کلاس abstract در C# با کلیدواژه abstract تعریف میشود. این کلاسها میتوانند توابع abstract داشته باشند که بدون هیچ پیادهسازی خاصی تعریف میشوند و پیادهسازی آنها به کلاسهای فرزند محول میشود. به عبارتی، این توابع باید در کلاسهای فرزند تعریف شوند.
استفاده از کلاس abstract
فرض کنید میخواهیم یک برنامه برای مدیریت حیوانات در یک باغوحش بنویسیم. در این باغوحش حیوانات مختلفی وجود دارند مانند اسب، گربه و سگ. همهی این حیوانات دارای ویژگیهای مشترکی هستند مثل خوراکی که میخورند، صدایی که میکنند یا رفتارهای خاصی که دارند. در این صورت، میتوانیم یک کلاس abstract به نام Animal تعریف کنیم و ویژگیهای مشترک در این کلاس قرار دهیم:
public abstract class Animal
{
public abstract string Food { get; }
public abstract string MakeSound() ;
}
حالا کلاسهای Cat, Dog و Horse میتوانند از کلاس Animal ارث بری کنند و ویژگیها و توابع مورد نیاز را پیادهسازی کنند:
public class Cat : Animal
{
public override string Food => "Fish";
public override string MakeSound() => "Meow";
}
کلاسهایی که از کلاسهای abstract ارث بری میکنند و تمام متدهای abstract را پیادهسازی میکنند، به عنوان کلاسهای concrete یا کانکریت شناخته میشوند. این کلاسها قابلیت نمونهسازی دارند و میتوانند برای ایجاد شئ استفاده شوند.
در این مثال، میتوانیم کلاسهای Dog و Horse را به عنوان کلاسهای concrete ایجاد کنیم که از Animal ارث بری میکنند:
public class Dog : Animal
{
public override string Food => "Meat";
public override string MakeSound() => "Woof";
}
public class Horse : Animal
{
public override string Food => "Hay";
public override string MakeSound() => "Neigh";
}
به این ترتیب، میتوانیم یک ساختار کلی برای تمام حیوانات ایجاد کنیم و به ویژگیها و رفتارهای خاص هر حیوان توجه کنیم.
در کل، استفاده از کلاس abstract به ما امکان میدهد تا ساختار کلی برای کلاسهای مشابه بسازیم و به کمک آن، برنامهنویسی را سادهتر و قابل مدیریتتر کنیم.
محدودیتهای کلاس abstract
هرچند کلاس abstract قدرتمند و کاربردی است، اما تعدادی محدودیت نیز دارد:
نمیتوان از کلاس abstract نمونهسازی (Instantiate) کرد. یعنی نمیتوان با استفاده از کلیدواژه new یک نمونه از کلاس abstract ایجاد کرد. به عبارت دیگر، کد زیر اشتباه است:
اگر یک کلاس از یک کلاس abstract ارث بری میکند، باید تمامی توابع abstract را پیادهسازی کند. در غیر این صورت، خود باید به عنوان یک کلاس abstract تعریف شود.
یک کلاس نمیتواند از بیش از یک کلاس abstract ارث بری کند. این محدودیت به وراثت یکسان (Single Inheritance) در C# برمیگردد.
مثال کاربردی کلاس abstract
حال فرض کنید میخواهیم یک سیستم برای مدیریت کارمندان در یک شرکت بزرگ طراحی کنیم. در این شرکت، کارمندانی وجود دارند که در بخشهای مختلفی مانند فروش، بازاریابی، مدیریت منابع انسانی و ... کار میکنند. هر یک از این کارمندان وظایف خاص خود را دارند اما تعدادی ویژگی اشتراکی نیز دارند مانند نام، شماره کارمندی، حقوق و ...
در این صورت، میتوانیم از یک کلاس abstract استفاده کنیم تا ویژگیهای اشتراکی کارمندان را در آن تعریف کنیم و سپس برای هر بخش یک کلاس جداگانه تعریف کنیم که از کلاس abstract ارث بری میکند:
public abstract class Employee
{
public string Name { get; set; }
public int EmployeeId { get; set; }
public decimal Salary { get; set; }
public abstract void PerformDuties() ;
}
public class SalesPerson : Employee
{
public override void PerformDuties()
{
// پیادهسازی وظایف خاص فروشنده
}
}
public class HRManager : Employee
{
public override void PerformDuties()
{
// پیادهسازی وظایف خاص مدیر منابع انسانی
}
}
در کل، کلاس abstract یک ابزار بسیار قدرتمند در سیشارپ است که به برنامهنویسان اجازه میدهد تا ساختار کد خود را بهبود بخشند، کد تکراری را کاهش دهند و تضمین کنند که برخی از رفتارها یا ویژگیها در تمام کلاسهایی که از یک کلاس abstract ارث بری میکنند، پیادهسازی شدهاند.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید