🚀 انقلاب اینترفیسها در #C مدرن: Default و Static Members
تو پست قبلی، یاد گرفتیم که کی باید از اینترفیس استفاده کنیم. اما داستان اینترفیسها به تعریف چند متد ختم نمیشه! در نسخههای مدرن #C، اینترفیسها به قابلیتهای فوقالعاده قدرتمندی مجهز شدن که قواعد بازی رو عوض میکنن.
امروز با این ابرقدرتها آشنا میشیم.
1️⃣ Default Interface Members (C# 8):
ارتقاء بدون شکستن کد! ✨
تصور کنید یه کتابخونه نوشتید و هزاران نفر دارن از اینترفیس ILogger شما استفاده میکنن. حالا اگه بخواید یه متد جدید به این اینترفیس اضافه کنید، کد تمام اون هزار نفر میشکنه!
Default Interface Members
این مشکل رو حل میکنه. شما میتونید یه متد جدید رو با پیادهسازی پیشفرض به اینترفیس اضافه کنید. این یعنی کلاسهایی که از اینترفیس شما استفاده میکنن، مجبور نیستن فوراً این متد جدید رو پیادهسازی کنن.
نکته کلیدی: ⚠️ این پیادهسازیهای پیشفرض، به صورت صریح (explicit) هستن. یعنی اگه کلاسی اون متد رو پیادهسازی نکنه، برای صدا زدنش باید حتماً آبجکت رو به خود اینترفیس کست کنید.
public interface ILogger
{
// متد جدید با پیادهسازی پیشفرض
void Log(string text) => Console.WriteLine(text);
void LogError(Exception ex); // متد قدیمی بدون پیادهسازی
}
public class MyLogger : ILogger
{
// این کلاس فقط مجبوره LogError رو پیادهسازی کنه
public void LogError(Exception ex) { /* ... */ }
}
// --- نحوه استفاده ---
var logger = new MyLogger();
// logger.Log("hi"); // ❌ خطای زمان کامپایل!
((ILogger)logger).Log("hi"); // ✅ درسته!
2️⃣ Static Interface Members:
ابزارهای کمکی و پلیمورفیسم استاتیک ⚙️
بله، درست خوندید! اینترفیسها در #C مدرن حتی میتونن اعضای استاتیک هم داشته باشن!
اعضای استاتیک غیرمجازی:
این اعضا (مثل فیلدها و متدهای استاتیک) برای تعریف مقادیر ثابت یا متدهای کمکی که به خود اینترفیس مرتبطن، عالین.
public interface ILogger
{
static string DefaultPrefix = "[INFO]: ";
void Log(string text) => Console.WriteLine(DefaultPrefix + text);
}
اعضای استاتیک مجازی/انتزاعی (از 11 #C):
این یکی از پیشرفتهترین قابلیتهای #C هست و درهای دنیای جدیدی به اسم "چندریختی استاتیک" (Static Polymorphism) رو باز میکنه (مثلاً برای Generic Math). کلاسهایی که این اینترفیس رو پیادهسازی میکنن، باید اون عضو استاتیک رو هم پیادهسازی کنن.
3️⃣ نکته فنی: اینترفیسها و Boxing
یه نکته پرفورمنسی مهم: وقتی شما یه struct (که Value Type هست) رو به یک اینترفیسی که پیادهسازی کرده کست میکنید، عمل Boxing اتفاق میفته و اون struct روی هیپ کپی میشه. این کار هزینه داره!
interface I { void Foo(); }
struct S : I { public void Foo() {} }
S s = new S();
s.Foo(); // بدون Boxing
I i = s; // ❌ Boxing اتفاق میفته!
i.Foo();🤔 حرف حساب و تجربه شما
این قابلیتهای مدرن، اینترفیسها رو از یه قرارداد ساده به یه ابزار طراحی فوقالعاده قدرتمند تبدیل کردن.
🔖 هشتگها:
#CSharp #DotNet #OOP #Interface #ModernCSharp