۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

زمان استفاده از کلاس انتزاعی در مقابل رابط کاربری در سی شارپ

درک تفاوت‌های بین کلاس انتزاعی و رابط، کلید طراحی برنامه‌های کاربردی با جفت و توسعه‌پذیر است.

درک تفاوت‌های بین کلاس انتزاعی و رابط، کلید طراحی برنامه‌های کاربردی با جفت و توسعه‌پذیر است.

هنگام طراحی برنامه‌ها، مهم است که بدانید چه زمانی از یک کلاس انتزاعی و چه زمانی از یک رابط استفاده کنید. اگرچه کلاس‌ها و رابط‌های انتزاعی از برخی جهات مشابه به نظر می‌رسند، تفاوت‌های کلیدی وجود دارد که تعیین می‌کند بهترین انتخاب برای آنچه که می‌خواهید انجام دهید، کدام است. در این پست وبلاگ در مورد این تفاوت ها و نحوه تصمیم گیری در مورد استفاده از آن بحث خواهم کرد.

پاسخ کوتاه: یک کلاس انتزاعی به شما امکان می دهد تا عملکردی ایجاد کنید که کلاس های فرعی می توانند پیاده سازی یا لغو شوند. یک رابط فقط به شما امکان تعریف عملکرد را می دهد، نه اینکه آن را پیاده سازی کنید. و در حالی که یک کلاس می تواند تنها یک کلاس انتزاعی را گسترش دهد، می تواند از چندین رابط استفاده کند. 

کلاس انتزاعی C# توضیح داده شد

کلاس انتزاعی نوع خاصی از کلاس است که قابل نمونه سازی نیست. یک کلاس انتزاعی به گونه ای طراحی شده است که توسط زیر کلاس هایی که متدهای آن را پیاده سازی می کنند یا نادیده می گیرند، به ارث برده شود. به عبارت دیگر، کلاس های انتزاعی یا تا حدی پیاده سازی می شوند یا اصلا پیاده سازی نمی شوند. شما می توانید در کلاس انتزاعی خود عملکردی داشته باشید – متدهای یک کلاس انتزاعی می توانند هم انتزاعی و هم مشخص باشند. یک کلاس انتزاعی می تواند سازنده داشته باشد – این یکی از تفاوت های عمده بین کلاس انتزاعی و رابط است. می‌توانید از کلاس‌های انتزاعی برای طراحی مؤلفه‌ها استفاده کنید و سطحی از عملکردهای مشترک را مشخص کنید که باید توسط کلاس‌های مشتق شده پیاده‌سازی شوند.

نحوه کار با توابع Azure در سی شارپ

رابط C# توضیح داده شد

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

آیا باید از یک کلاس انتزاعی یا یک رابط استفاده کنم؟

کلاس‌های انتزاعی این انعطاف‌پذیری را در اختیار شما قرار می‌دهند تا روش‌های مشخص و برخی روش‌های دیگر را که کلاس‌های مشتق شده باید پیاده‌سازی کنند، داشته باشید. در مقابل، اگر از اینترفیس ها استفاده می کنید، باید تمام متدهای کلاسی را که رابط را گسترش می دهد، پیاده سازی کنید. یک کلاس انتزاعی انتخاب خوبی است اگر برنامه‌هایی برای گسترش آینده دارید – یعنی اگر احتمال گسترش آینده در سلسله مراتب کلاس وجود دارد. اگر می‌خواهید هنگام استفاده از واسط‌ها، از توسعه آینده پشتیبانی کنید، باید رابط را گسترش دهید و یک رابط جدید ایجاد کنید.

در یک نکته دیگر، در صورت نیاز، افزودن یک رابط جدید به سلسله مراتب آسان است. با این حال، اگر قبلاً یک کلاس انتزاعی در سلسله مراتب خود دارید، نمی‌توانید کلاس انتزاعی دیگری اضافه کنید، به عنوان مثال، تنها در صورتی می‌توانید یک کلاس انتزاعی اضافه کنید که هیچ کدام در دسترس نباشد. اگر می خواهید قراردادی در مورد برخی رفتارها یا عملکردها داشته باشید، باید از یک رابط استفاده کنید. اگر نیاز به نوشتن همان کد برای متدهای واسط دارید، نباید از رابط استفاده کنید. در این حالت باید از یک کلاس انتزاعی استفاده کنید، روش را یک بار تعریف کنید و در صورت نیاز دوباره از آن استفاده کنید. از رابط‌ها برای جدا کردن کد برنامه‌تان از پیاده‌سازی‌های خاص آن یا محدود کردن دسترسی به اعضای یک نوع خاص استفاده کنید.

ngrok دروازه API را به عنوان یک سرویس معرفی کرد

همانطور که مستندات رابط‌های مایکروسافت وجود دارد :

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

پیاده سازی رابط ضمنی و صریح

اینترفیس ها را می توان به صورت ضمنی یا صریح پیاده سازی کرد. اجازه دهید توضیح دهم که این دو پیاده سازی چگونه با هم تفاوت دارند. رابطی به نام 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();

چگونه در سی شارپ کارهای بیشتری انجام دهیم:

Rust فضای نام ویژگی تشخیصی را برای پیام های کامپایلر اضافه می کند