🏛 کالبدشکافی وراثت در #C: سازندهها، required و ترتیب اجرا
وقتی کلاسهای فرزند میخوان آبجکت بسازن، چه اتفاقی پشت صحنه میفته؟ امروز به عمیقترین قوانین ساخت و ساز در سلسلهمراتب وراثت شیرجه میزنیم.
1️⃣ کلیدواژه base: صحبت با کلاس پدر
base
به شما اجازه میده از داخل کلاس فرزند، به اعضای کلاس پدر دسترسی داشته باشید. دو کاربرد اصلی داره:
صدا زدن عضو بازنویسی شده:
اگه متدی رو override کردید، با base میتونید به پیادهسازی اصلی در کلاس پدر دسترسی پیدا کنید.
public override decimal Liability => base.Liability + Mortgage;
صدا زدن سازنده پدر:
با سینتکس : base(...) صراحتاً سازنده مورد نظرتون در کلاس پدر رو صدا میزنید.
public class Subclass : Baseclass
{
public Subclass(int x) : base(x) { }
}
2️⃣ قوانین سازندهها در وراثت ⚖️
• قانون اول: سازنده کلاس پدر همیشه قبل از سازنده کلاس فرزند اجرا میشه.
• قانون دوم (تله مهم): اگه شما : base(...) رو ننویسید، #C به صورت خودکار سعی میکنه سازنده بدون پارامتر پدر رو صدا بزنه. اگه کلاس پدر سازنده بدون پارامتر نداشته باشه، خطای زمان کامپایل میگیرید!
3️⃣ required members (از C# 11):
جایگزین مدرن ✨
گاهی وقتا زنجیره سازندهها خیلی طولانی میشه. از #C 11 به بعد، میتونید پراپرتیها یا فیلدهایی رو با کلمه کلیدی required مشخص کنید. این یعنی هر کسی که از کلاس شما آبجکت میسازه، مجبوره که این اعضا رو با استفاده از Object Initializer مقداردهی کنه.
public class Asset
{
public required string Name;
}
// ✅ درسته
Asset a1 = new Asset { Name = "House" };
// ❌ خطای زمان کامپایل! چون Name مقداردهی نشده
Asset a2 = new Asset();
💡نکته: برای اینکه به یک سازنده اجازه بدید این قانون رو دور بزنه، میتونید از اتریبیوت
[SetsRequiredMembers] استفاده کنید.4️⃣ ترتیب دقیق ساخت (Deep Dive) 🔬
وقتی یه آبجکت فرزند ساخته میشه، ترتیب اجرای دقیق عملیات به این صورته:
فاز اول (از فرزند به پدر):
•فیلدهای کلاس فرزند مقداردهی اولیه میشن.
• آرگومانهای پاس داده شده به base(...) ارزیابی میشن.
• این روند تا بالاترین کلاس در سلسلهمراتب ادامه پیدا میکنه.
فاز دوم (از پدر به فرزند):
• حالا بدنهی سازندهها، از کلاس پدر شروع شده و به سمت کلاس فرزند اجرا میشن.
مثال کتاب برای درک بهتر این ترتیب:
public class B
{
int x = 1; // مرحله ۳: این اجرا میشه
public B(int x)
{
// مرحله ۴: بدنه سازنده پدر اجرا میشه
}
}
public class D : B
{
int y = 1; // مرحله ۱: این اول از همه اجرا میشه
public D(int x)
: base(x + 1) // مرحله ۲: آرگومان base ارزیابی میشه
{
// مرحله ۵: بدنه سازنده فرزند در آخر اجرا میشه
}
}
🤔 حرف حساب و تجربه شما
درک این جزئیات، شما رو به یک متخصص واقعی در طراحی کلاسهای شیءگرا تبدیل میکنه.
🔖 هشتگها:
#OOP #Inheritance #BestPractices #Constructor