در زبان برنامهنویسی سی شارپ ، Abstract و Interface دو مفهوم مهم در ارثبری و Polymorphism هستند. هر دو مفهوم میتوانند برای تعریف قراردادهای برنامهنویسی مورد استفاده قرار بگیرند، اما دارای تفاوتهای مهمی هستند. در این مقاله، به بررسی این تفاوتها میپردازیم و کاربردهای هر کدام را بررسی میکنیم.
Abstract
Abstract به معنای "مجرد" است و به کلاسی اشاره دارد که نمیتوان آن را نمونهسازی کرد. در واقع، Abstract کلاسی است که شامل حداقل یک عضو Abstract است و برای استفاده در کلاسهای فرزند طراحی شده است. عضوهای Abstract توابعی هستند که توسط کلاسهای فرزند باید پیادهسازی شوند.
یک نقلقول از کتاب "C# 7.0 in a Nutshell" توضیح میدهد:
"کلاس Abstract یک ساختار کلی است که میتواند توسط کلاسهای دیگری که از آن ارثبری میکنند، پیادهسازی شود." - جوزف آلباهاری
کاربردهای کلاس Abstract عبارتاند از:
• تعریف یک قالب عمومی برای کلاسهای مشابه
• اجبار کلاسهای فرزند به پیادهسازی عضوهای Abstract
• کاهش تکرار کد در برنامهنویسی
Interface
Interface به معنای "رابط" است و یک قرارداد برنامهنویسی را تعریف میکند. در واقع، Interface مجموعهای از تعریفهای عمومی است که کلاسها برای ارثبری و پیادهسازی آنها استفاده میکنند. کلاسی که یک Interface را پیادهسازی میکند، باید تمام عضوهای آن را پیادهسازی کند.interface در سی شارپ کاربرد های مختلفی دارد.
کاربردهای Interface عبارتاند از:
• تعریف قراردادهای عمومی برای کلاسها
• پیادهسازی چندگانه
• ارتباطات بین کلاسها در برنامه
تفاوتهای Abstract و Interface
در ادامه، تفاوتهای مهم بین Abstract و Interface را بررسی میکنیم:
1. مجرد بودن: کلاس Abstract میتواند یک کلاس مجرد باشد و نمیتواند نمونهسازی شود. درحالیکه Interface هیچگاه نمیتواند یک کلاس مجرد باشد و همیشه برای پیادهسازی توسط کلاسها استفاده میشود.
2. تعداد پیادهسازی: یک کلاس میتواند از یک کلاس Abstract فقط بهعنوان پدر وراثت کند، اما میتواند از چندین Interface به طور همزمان پیادهسازی کند. این محدودیت به وراثت یکسان (Single Inheritance) در سی شارپ برمیگردد.
3. محدودیتها: یک کلاس Abstract میتواند ویژگیها و روشهای پیشفرض داشته باشد و از آنها ارثبری شود، درحالیکه Interface تنها قراردادهای عمومی را تعریف میکند و کلاسها از آن ارثبری میکنند.
نمونه کد برای درک تفاوت Abstract و Interface
در این نمونه کد، قصد داریم با استفاده از Abstract و Interface، تفاوت بین آنها را نشان دهیم. فرض کنید که در یک برنامه برای ساختن اتومبیل نیاز داریم. هر اتومبیل باید قابلیت رانندگی و توقف را داشته باشد، اما نوع موتور و طراحی هر اتومبیل ممکن است متفاوت باشد. این موارد را با استفاده از Abstract و Interface پیادهسازی خواهیم کرد.
// کلاس Abstract برای تعریف قابلیتهای عمومی اتومبیل
public abstract class Car
{
// قابلیت رانندگی
public abstract void Drive();
// قابلیت توقف
public abstract void Stop();
}
// Interface برای تعریف ویژگیهای مخصوص موتور اتومبیل
public interface IEngine
{
void StartEngine();
void StopEngine();
}
// Interface برای تعریف ویژگیهای مخصوص طراحی اتومبیل
public interface IDesign
{
void Paint();
void AddFeatures();
}
// کلاسی که از Abstract و Interfaceها ارث بری میکند
public class SportsCar : Car, IEngine, IDesign
{
// پیادهسازی قابلیت رانندگی
public override void Drive()
{
Console.WriteLine("Driving the sports car at high speed.");
}
// پیادهسازی قابلیت توقف
public override void Stop()
{
Console.WriteLine("Stopping the sports car.");
}
// پیادهسازی روشهای مخصوص موتور
public void StartEngine()
{
Console.WriteLine("Starting the sports car engine.");
}
public void StopEngine()
{
Console.WriteLine("Stopping the sports car engine.");
}
// پیادهسازی روشهای مخصوص طراحی
public void Paint()
{
Console.WriteLine("Painting the sports car with a glossy finish.");
}
public void AddFeatures()
{
Console.WriteLine("Adding aerodynamic features to the sports car.");
}
}
// مثال استفاده از کلاس SportsCar
class Program
{
static void Main(string[] args)
{
SportsCar sportsCar = new SportsCar();
sportsCar.StartEngine();
sportsCar.Drive();
sportsCar.Stop();
sportsCar.StopEngine();
sportsCar.Paint();
sportsCar.AddFeatures();
}
}
در این مثال کد، کلاس ابسترکت "Car" برای تعریف قابلیتهای عمومی اتومبیل استفاده شده است. همچنین اینترفیس"IEngine" برای تعریف ویژگیهای مخصوص موتور اتومبیل و اینترفیس "IDesign" برای تعریف ویژگیهای مخصوص طراحی اتومبیل استفاده شده است. کلاس "SportsCar" از کلاس Abstract و همچنین از هر دو Interface ارث بری میکند و تمام قابلیتها را پیادهسازی میکند.
در مثال استفاده از کلاس "SportsCar"، مشاهده میکنید که میتوانیم به ترتیب قابلیتهای رانندگی و توقف را فراخوانی کنیم و همچنین قابلیتهای مخصوص موتور و طراحی را نیز اجرا کنیم.
این مثال کد به راحتی قابل فهم است و نشان میدهد که با استفاده از Abstract و Interface، میتوانیم قابلیتهای عمومی و ویژگیهای مخصوص را در کلاسها پیادهسازی کنیم و هر کلاس میتواند از چندین Interface ارث بری کند.
نتیجهگیری
در این مقاله، تفاوت بین Abstract و Interface در زبان برنامهنویسی سی شارپ را بررسی کردیم. هر کدام از این دو مفهوم کاربردهای خود را دارند و بسته به شرایط و نیازهای برنامه، انتخاب مناسبی خواهند بود. باتوجهبه مثالها و توضیحات ارائه شده، امیدواریم که تفاوتها بین این دو مفهوم را بهتر درک کنید و بتوانید آنها را در برنامهنویسی خود بهره ببرید.در مقالهای که به تفاوت بین "Abstract و Interface در #C" میپردازیم، ارتباطات نزدیکی با سایر مفاهیم پیشرفته در برنامهنویسی شیگرا داریم. مقاله "Expression Func در سیشارپ" میتواند در فهم بهتر تکنیکهای پیشرفته در برنامهنویسی شیگرا، که شامل استفاده از کلاسهای انتزاعی و رابطها (interfaces) است، برای شما مفید باشد. همچنین، "Throw در سی شارپ" به مدیریت استثناها و تأثیر آن بر انواع کلاسها و رابطها میپردازد. "Indexer در سیشارپ" نیز میتواند نقش مهمی در فهم بهتر تفاوتها بین کلاسهای انتزاعی و رابطها در مدیریت دادهها ایفا کند. این مقالات میتوانند به شما کمک کنند تا با جزئیات بیشتری از مفهوم کلاسهای انتزاعی و رابطها در C# آشنا شوید.
برای افزودن دیدگاه خود، نیاز است ابتدا وارد حساب کاربریتان شوید