درک تفاوتهای بین کلاس انتزاعی و رابط، کلید طراحی برنامههای کاربردی با جفت و توسعهپذیر است.
هنگام طراحی برنامهها، مهم است که بدانید چه زمانی از یک کلاس انتزاعی و چه زمانی از یک رابط استفاده کنید. اگرچه کلاسها و رابطهای انتزاعی از برخی جهات مشابه به نظر میرسند، تفاوتهای کلیدی وجود دارد که تعیین میکند بهترین انتخاب برای آنچه که میخواهید انجام دهید، کدام است. در این پست وبلاگ در مورد این تفاوت ها و نحوه تصمیم گیری در مورد استفاده از آن بحث خواهم کرد.
پاسخ کوتاه: یک کلاس انتزاعی به شما امکان می دهد تا عملکردی ایجاد کنید که کلاس های فرعی می توانند پیاده سازی یا لغو شوند. یک رابط فقط به شما امکان تعریف عملکرد را می دهد، نه اینکه آن را پیاده سازی کنید. و در حالی که یک کلاس می تواند تنها یک کلاس انتزاعی را گسترش دهد، می تواند از چندین رابط استفاده کند.
کلاس انتزاعی C# توضیح داده شد
کلاس انتزاعی نوع خاصی از کلاس است که قابل نمونه سازی نیست. یک کلاس انتزاعی به گونه ای طراحی شده است که توسط زیر کلاس هایی که متدهای آن را پیاده سازی می کنند یا نادیده می گیرند، به ارث برده شود. به عبارت دیگر، کلاس های انتزاعی یا تا حدی پیاده سازی می شوند یا اصلا پیاده سازی نمی شوند. شما می توانید در کلاس انتزاعی خود عملکردی داشته باشید – متدهای یک کلاس انتزاعی می توانند هم انتزاعی و هم مشخص باشند. یک کلاس انتزاعی می تواند سازنده داشته باشد – این یکی از تفاوت های عمده بین کلاس انتزاعی و رابط است. میتوانید از کلاسهای انتزاعی برای طراحی مؤلفهها استفاده کنید و سطحی از عملکردهای مشترک را مشخص کنید که باید توسط کلاسهای مشتق شده پیادهسازی شوند.
رابط C# توضیح داده شد
اینترفیس اساساً یک قرارداد است—پیادهسازی ندارد. یک رابط فقط می تواند شامل اعلان های متد باشد. نمی تواند شامل تعاریف متد باشد. همچنین نمی توانید هیچ داده عضوی را در یک رابط داشته باشید. در حالی که یک کلاس انتزاعی ممکن است شامل تعاریف متد، فیلدها و سازنده باشد، یک رابط ممکن است فقط اعلان رویدادها، متدها و خصوصیات داشته باشد. متدهای اعلام شده در یک اینترفیس باید توسط کلاس هایی که این رابط را پیاده سازی می کنند، پیاده سازی شوند. توجه داشته باشید که یک کلاس می تواند بیش از یک رابط را پیاده سازی کند اما فقط یک کلاس را گسترش دهد. کلاسی که اینترفیس را پیاده سازی می کند باید تمام اعضای خود را پیاده سازی کند. مانند یک کلاس انتزاعی، یک رابط را نمی توان نمونه سازی کرد.
آیا باید از یک کلاس انتزاعی یا یک رابط استفاده کنم؟
کلاسهای انتزاعی این انعطافپذیری را در اختیار شما قرار میدهند تا روشهای مشخص و برخی روشهای دیگر را که کلاسهای مشتق شده باید پیادهسازی کنند، داشته باشید. در مقابل، اگر از اینترفیس ها استفاده می کنید، باید تمام متدهای کلاسی را که رابط را گسترش می دهد، پیاده سازی کنید. یک کلاس انتزاعی انتخاب خوبی است اگر برنامههایی برای گسترش آینده دارید – یعنی اگر احتمال گسترش آینده در سلسله مراتب کلاس وجود دارد. اگر میخواهید هنگام استفاده از واسطها، از توسعه آینده پشتیبانی کنید، باید رابط را گسترش دهید و یک رابط جدید ایجاد کنید.
در یک نکته دیگر، در صورت نیاز، افزودن یک رابط جدید به سلسله مراتب آسان است. با این حال، اگر قبلاً یک کلاس انتزاعی در سلسله مراتب خود دارید، نمیتوانید کلاس انتزاعی دیگری اضافه کنید، به عنوان مثال، تنها در صورتی میتوانید یک کلاس انتزاعی اضافه کنید که هیچ کدام در دسترس نباشد. اگر می خواهید قراردادی در مورد برخی رفتارها یا عملکردها داشته باشید، باید از یک رابط استفاده کنید. اگر نیاز به نوشتن همان کد برای متدهای واسط دارید، نباید از رابط استفاده کنید. در این حالت باید از یک کلاس انتزاعی استفاده کنید، روش را یک بار تعریف کنید و در صورت نیاز دوباره از آن استفاده کنید. از رابطها برای جدا کردن کد برنامهتان از پیادهسازیهای خاص آن یا محدود کردن دسترسی به اعضای یک نوع خاص استفاده کنید.
همانطور که مستندات رابطهای مایکروسافت وجود دارد :
با استفاده از واسطها، میتوانید برای مثال، رفتار از چندین منبع را در یک کلاس قرار دهید. این قابلیت در سی شارپ مهم است زیرا این زبان از وراثت چندگانه کلاسها پشتیبانی نمیکند. علاوه بر این، اگر میخواهید وراثت را برای ساختارها شبیهسازی کنید، باید از یک رابط استفاده کنید، زیرا آنها در واقع نمیتوانند از ساختار یا کلاس دیگری ارث ببرند.
پیاده سازی رابط ضمنی و صریح
اینترفیس ها را می توان به صورت ضمنی یا صریح پیاده سازی کرد. اجازه دهید توضیح دهم که این دو پیاده سازی چگونه با هم تفاوت دارند. رابطی به نام IBusinessLogic
را در نظر بگیرید.
public interface IBusinessLogic
{
void Initialize();
}
کلاس زیر با نام BusinessLogic
رابط IBusinessLogic
را پیاده سازی می کند.
public class BusinessLogic : IBusinessLogic
{
public void Initialize()
{
//Some code
}
}
می توانید نمونه ای از کلاس BusinessLogic
را به صراحت ایجاد کنید و سپس روش Initialize()
را مطابق شکل زیر فراخوانی کنید.
IBusinessLogic businessLogic = new BusinessLogic();
businessLogic.Initialize();
قطعه کد زیر نشان می دهد که چگونه می توانید رابط IBusinessLogic
را بطور ضمنی پیاده سازی کنید.
public class BusinessLogic : IBusinessLogic
{
void IBusinessLogic.Initialize()
{
}
}
اکنون می توانید با استفاده از ارجاع به رابط IBusinessLogic
روش Initialize()
را به همان روش فراخوانی کنید. تفاوت این دو رویکرد در این است که وقتی رابط را به طور صریح در کلاس خود پیاده سازی می کنید، محدود به فراخوانی روشی از رابط خود با استفاده از ارجاع به رابط هستید. بنابراین قطعه کد زیر کار نمی کند، یعنی کامپایل نمی شود.
BusinessLogic businessLogic = new BusinessLogic();
businessLogic.Initialize();
چگونه در سی شارپ کارهای بیشتری انجام دهیم:
- زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ
- نحوه کار با AutoMapper در سی شارپ
- نحوه استفاده از عبارات لامبدا در سی شارپ
- نحوه کار با نمایندگان Action، Func و Predicate در C#
- نحوه کار با نمایندگان در سی شارپ
- نحوه پیاده سازی یک لاگر ساده در سی شارپ
- نحوه کار با ویژگی ها در سی شارپ
- نحوه کار با log4net در سی شارپ
- نحوه پیاده سازی الگوی طراحی مخزن در سی شارپ
- نحوه کار با بازتاب در سی شارپ
- نحوه کار با فایل سیستم واچر در سی شارپ
- نحوه انجام اولیه سازی تنبل در سی شارپ
- نحوه کار با MSMQ در سی شارپ
- نحوه کار با متدهای افزونه در سی شارپ
- نحوه استفاده از عبارات لامبدا در سی شارپ
- زمان استفاده از کلمه کلیدی فرار در سی شارپ
- نحوه استفاده از کلمه کلیدی yield در سی شارپ
- نحوه پیاده سازی چندشکلی در سی شارپ
- نحوه ایجاد زمانبندی کار خود در سی شارپ
- نحوه کار با RabbitMQ در سی شارپ
- نحوه کار با تاپل در سی شارپ
- کاوش روش های مجازی و انتزاعی در سی شارپ
پست های مرتبط
زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ
زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ
زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ