🏛 ستونهای OOP در #C: وراثت، چندریختی و کستینگ
آمادهاید که به قلب برنامهنویسی شیءگرا (OOP) سفر کنیم؟ امروز میخوایم سه تا از مهمترین و به هم پیوستهترین مفاهیم #C رو کالبدشکافی کنیم: وراثت، چندریختی و کستینگ.
تسلط بر این سه مفهوم، پایه و اساس ساختن سیستمهای انعطافپذیر و قدرتمنده.
1️⃣ وراثت (Inheritance): "یک نوع از..." 👨👩👧
وراثت به یک کلاس اجازه میده که ویژگیها و رفتارهای یک کلاس دیگه رو به ارث ببره. به کلاس اصلی میگیم کلاس پایه (Base Class) و به کلاس جدید میگیم کلاس مشتقشده (Derived Class). این یعنی "کلاس مشتقشده، یک نوع از کلاس پایه است".
// این کلاس پایه ماست
public class Asset
{
public string Name;
}
// این دو کلاس، از Asset ارثبری میکنند
public class Stock : Asset
{
public long SharesOwned;
}
public class House : Asset
{
public decimal Mortgage;
}
حالا Stock و House هم پراپرتی Name رو دارن و هم پراپرتیهای مخصوص خودشون.
🎭 جادوی چندریختی (Polymorphism) در
C# : Upcasting و Downcasting
2️⃣ چندریختی (Polymorphism): یک متغیر، چند چهره
چندریختی یعنی شما میتونید یه متغیر از نوع کلاس پایه داشته باشید، ولی در زمان اجرا، به اون یک نمونه از هر کدوم از کلاسهای فرزندش رو اختصاص بدید. این قابلیت به شما اجازه میده کدهای خیلی انعطافپذیری بنویسید.
مثال: این متد یک Asset به عنوان ورودی میگیره، ولی شما میتونید هم Stock و هم House رو بهش پاس بدید!
// کلاسهای پست قبلی
public class Asset { public string Name; }
public class Stock : Asset { public long SharesOwned; }
public class House : Asset { public decimal Mortgage; }
// این متد به لطف چندریختی، با هر نوع Asset کار میکنه
public static void Display(Asset asset)
{
Console.WriteLine(asset.Name);
}
// --- نحوه استفاده ---
Stock msft = new Stock { Name = "MSFT" };
House mansion = new House { Name = "Mansion" };
Display(msft); // خروجی: MSFT
Display(mansion); // خروجی: Mansion
3️⃣ کستینگ (Casting): تغییر زاویه دید به آبجکت 🔄
کستینگ یعنی تغییر نوع یک رفرنس برای دسترسی به اعضای مختلف. دو نوع اصلی داریم:
Upcasting (تبدیل فرزند به پدر) ⬆️
این کار همیشه امنه و به صورت ضمنی (implicit) انجام میشه. شما یک نمونه از کلاس فرزند رو در یک متغیر از نوع پدر قرار میدید. بعد از این کار، شما به آبجکت از یک زاویه دید "محدودتر" نگاه میکنید و فقط به اعضایی که در کلاس پدر تعریف شدن، دسترسی دارید.
Stock msft = new Stock { Name = "MSFT", SharesOwned = 1000 };
Asset a = msft; // Upcast (ضمنی و همیشه امن)
Console.WriteLine(a.Name); // ✅ درسته، چون Name در Asset هست
// Console.WriteLine(a.SharesOwned); // ❌ خطای زمان کامپایل! a از نوع Asset است و SharesOwned را نمیشناسد.Downcasting (تبدیل پدر به فرزند) ⬇️
این کار میتونه خطرناک باشه و باید به صورت صریح (explicit) با (type) انجام بشه. شما به کامپایلر میگید: "من مطمئنم این آبجکت که از نوع پدره، در واقع یک نمونه از نوع فرزند هست". اگه اشتباه کرده باشید، در زمان اجرا با خطای InvalidCastException مواجه میشید.
Stock msft = new Stock();
Asset a = msft; // Upcast
// Downcast موفقیتآمیز
Stock s = (Stock)a;
Console.WriteLine(s.SharesOwned); // <بدون خطا>
// --- مثال خطا ---
House h = new House();
Asset a2 = h; // Upcast
// ❌ Downcast ناموفق! a2 یک Stock نیست.
// Stock s2 = (Stock)a2; // در زمان اجرا خطای InvalidCastException میدهد
🤔 حرف حساب و تجربه شما
درک درست Upcasting و Downcasting، کلید استفاده امن و قدرتمند از چندریختی در کدهای شماست. (در آینده با روشهای امنتر Downcasting مثل as و is آشنا میشیم).
بهترین مثالی که از قدرت چندریختی تو پروژههاتون دیدید چی بوده؟ آیا تا حالا به خطای InvalidCastException به خاطر یه Downcast اشتباه برخورد کردید؟
🔖 هشتگها:
#OOP #Polymorphism #Casting