🏛 راهنمای کامل وراثت پیشرفته در #C: از virtual تا sealed
آمادهاید برای یک شیرجه عمیق به قلب تپنده برنامهنویسی شیءگرا؟ امروز میخوایم تمام ابزارهای #C برای کنترل دقیق وراثت و چندریختی رو کالبدشکافی کنیم.
1️⃣ تعریف قرارداد برای فرزندان: virtual و abstract
برای اینکه به کلاسهای فرزند اجازه بدیم رفتار کلاس پدر رو تخصصیسازی کنن، از این دو کلمه کلیدی استفاده میکنیم:
virtual (قرارداد اختیاری): ✍️
با virtual، کلاس پایه یک پیادهسازی پیشفرض ارائه میده ولی به فرزندان اجازه override کردن (بازنویسی) اون رفتار رو میده.
public class Asset
{
public string Name;
public virtual decimal Liability => 0;
}
public class House : Asset
{
public decimal Mortgage;
public override decimal Liability => Mortgage;
}
abstract (قرارداد اجباری): 🏗
با abstract، کلاس پایه هیچ پیادهسازیای ارائه نمیده و فرزندان رو مجبور به override کردن و پیادهسازی اون عضو میکنه. کلاسی که عضو abstract داره، خودش هم باید abstract باشه و نمیشه ازش نمونه (new) ساخت.
public abstract class Asset
{
public abstract decimal NetValue { get; }
}
public class Stock : Asset
{
public long SharesOwned;
public decimal CurrentPrice;
public override decimal NetValue => CurrentPrice * SharesOwned;
}
2️⃣ مخفی کردن عضو با new (Hiding)
گاهی وقتا یه عضو در کلاس فرزند، هماسم عضوی در کلاس پدر میشه. به این کار میگن مخفی کردن (Hiding). کلمه کلیدی new فقط برای اینه که به کامپایلر بگیم "من میدونم دارم چیکار میکنم، این کارم عمدیه!" و جلوی Warning رو بگیریم.
3️⃣ دوئل بزرگ: override در برابر new ⚔️
این مهمترین بخش ماجراست. تفاوت این دو، در رفتار چندریختی (Polymorphic) مشخص میشه:
• override:
رفتار واقعی چندریختی رو پیاده میکنه. مهم نیست متغیر شما از چه نوعی باشه (پدر یا فرزند)، همیشه متدِ نوعِ واقعی آبجکت صدا زده میشه.
• new:
چندریختی رو میشکنه! متدی که صدا زده میشه، بستگی به نوع متغیر در زمان کامپایل داره، نه نوع واقعی آبجکت.
این مثال رو ببینید تا کامل متوجه بشید:
public class BaseClass
{
public virtual void Foo() { Console.WriteLine("BaseClass.Foo"); }
}
public class Overrider : BaseClass
{
public override void Foo() { Console.WriteLine("Overrider.Foo"); }
}
public class Hider : BaseClass
{
public new void Foo() { Console.WriteLine("Hider.Foo"); }
}
// --- نتایج ---
Overrider over = new Overrider();
BaseClass b1 = over;
over.Foo(); // خروجی: Overrider.Foo
b1.Foo(); // خروجی: Overrider.Foo <- (چون override شده، رفتار واقعی حفظ میشه)
Hider h = new Hider();
BaseClass b2 = h;
h.Foo(); // خروجی: Hider.Foo
b2.Foo(); // خروجی: BaseClass.Foo <- (چون new شده، متد کلاس پایه اجرا میشه!)
4️⃣ قفل کردن وراثت با sealed 🔒
حالا اگه بخواید جلوی override شدن بیشتر رو در زنجیره وراثت بگیرید، از sealed استفاده میکنید.
• sealed روی متد:
میتونید یه متد override شده رو sealed کنید تا کلاسهای فرزند بعدی دیگه نتونن اون رو تغییر بدن.
• sealed روی کلاس:
یا میتونید کل یک کلاس رو sealed کنید تا دیگه هیچ کلاسی نتونه ازش ارثبری کنه.
🤔 حرف حساب
تسلط بر این کلمات کلیدی، شما رو از یه کاربر ساده وراثت، به یک معمار واقعی کلاسها تبدیل میکنه.
🔖 هشتگها:
#OOP #Inheritance #Override #Sealed #Polymorphism