انتزاعی سازی با abstract
نام دوره: زبان سی شارپ مقدماتی
نویسنده: علی مقدم جاه (مدرس دوره)
انتزاعی سازی با abstract
در پست آموزش ارث بری در کلاسها، با یکی از کاربرد کلمه abstract آشنا شدید.
یعنی متوجه شدید که اگر بخواهید از کلاس والد شما هیچ شئ یا نمونهای تعریف نشود، میتوانید از کلمه abstract استفاده کنید؛ اما در این پست کاربرد بعدی این کلمه کلیدی را متوجه خواهید شد.
انتزاعی سازی چیست؟
فرض کنید یک کلاس والد به همراه چندین کلاس فرزند در برنامه خود دارید.
خب همانطور که میدانید، در این حالت تمامی کلاسهای فرزند، یک کپی از اعضای داخل کلاس والد را به ارث میبرند.
اما با چه ساختاری؟
دقیقا با همان ساختار و کدهای نوشته شده درون محدوده بلاک کلاس والد!
این مبحث مربوط به وراثت بوده که درون پست آموزش ارث بری در کلاسها آن را یاد گرفتید.
اما در اکثر مواقع پیش خواهد آمد که عضو داخل کلاس والد، جوابگوی نیاز کلاسهای فرزند نیست! که دراینصورت کلاس فرزند میتواند مثلا متد داخل کلاس والد را برای خود override کند. (اگر مبحث دوباره نویسی متدها را بلد نیستید، در اینجا بخوانید)
مبحث دوباره نویسی متدها یا همان overriding، مربوط به رابطه کلاس فرزند با کلاس والد میشود، یعنی کلاس فرزند قصد دارد تا عضوی از کلاس والد را به شکلی که مورد نیاز خودش است، استفاده کند؛ نه به آن صورت که درون کلاس والد نوشته شده، درنتیجه آن عضو را از کلاس والد برای خود دوباره نویسی میکند.
اما انتزاعی سازی دقیقا برعکس این مسئله است!
در انتزاعی سازی، کلاس والد میتواند کلاسهای فرزند خود را مجبور به دوباره نویسی بعضی از اعضا خود کند. یعنی دیگر دلبخواهی نبوده و تمامی کلاسهای فرزند مجبور به دوباره نویسی بعضی از عضوهای داخل کلاس والد برای خود میشوند.
مثلا کلاس والد میگوید که من یک متد Print صلاح میدانم که تمامی کلاسهای فرزند داشته باشند، پس اون متد Print را با استفاده از انتزاعی سازی، برای تمامی کلاسهای فرزند خود اجبار به دوبارهنویسی میکند.
به زبان ساده، انتزاعی سازی یعنی اجبار دوباره نویسی اعضای داخل کلاس والد، درون کلاسهای فرزند!
نکته: برای انتزاعی سازی به این روش، حتما باید کلاس والد از نوع abstract تعریف شده باشد:
public abstract class Person
{
}
در انتزاعی سازی به این روش، میزان انتزاعی سازی کاملا دست خود ماست!
یعنی میتوانیم مشخص کنیم که کدام یک از عضوهای کلاس والد بصورت انتزاعی، و کدام عضوها بصورت ساده تعریف شوند.
نکته: انتزاعی سازی پراپرتیها کاملا غیرمنطقی است، پس یادتان باشد که پراپرتیها را در کلاس والد انتزاعی نکنید.
بیشتر از متدها برای انتزاعی سازی استفاده میشود، برای انتزاعی سازی متد Print باید آن را به روش زیر تعریف کنید:
public abstract class Person
{
public abstract void Print();
}
همانطور که در مثال بالا مشاهده میکنید، متد Print به روش انتزاعی تعریف شده است.
نکته ۱: برای انتزاعی سازی، حتما باید کلمه abstract را پس از سطح دسترسی بنویسیم.
نکته ۲: متدهایی که به شکل انتزاعی سازی تعریف میشوند، دارای بدنه نمیباشند! همانطور که مشاهده میکنید در مثال بالا، پس از پرانتر متد Print از سمیکالن استفاده شده است.
علت آن هم این است که متدهای انتزاعی شده در کلاس والد، قابل فراخوانی توسط اشیاء تعریف شده از طریق کلاسهای فرزند را ندارند، درنتیجه نیازی هم به بدنه (بلاک دارای کد) ندارند، چرا که هیچ کاری انجام نمیدهند.
با اینکار که ما متد Print را بدون بدنه و با استفاده از کلمه کلیدی abstract انتزاعی کردیم، یعنی تمامی کلاسهای فرزند کلاس Person باید یک متد با نام Print با همین ساختار یعنی سطح دسترسی public خروجی void و نام Print برای خود دوباره نویسی کنند.
در دوباره نویسی متدهای انتزاعی شده درون کلاسهای فرزند، میتوانید از کدهای مورد نیاز کلاس فرزند، درون محدوه بلاک متدی که قرار است دوباره نویسی شود استفاده کنید.
پس اینکه محتوای بلاک این متدها چی باشد مهم نیست، تنها چیز مهم این است که ساختار متدها باید عینا همان ساختار متد تعریف شده در کلاس والد باشد.
ساختار یعنی سطح دسترسی، نوع خروجی، نام متد و …
مثال:
public class Student :Person
{
public int StudentCode { get; set; }
public Student(int studentCode, int id, string fullName):base(id, fullName)
{
this.StudentCode = studentCode;
}
public void Print()
{
Console.WriteLine($"Code: {StudentCode}");
}
}
همانطور که مشاهده میکنید، کلاس Student که فرزند کلاس Person است، بالاجبار متد Print را با همان نام و ساختار و البته با کدهای مورد نیاز خود در محدوه بلاک متد تعریف کرده است.
درنتیجه تمامی کلاسهای فرزند دیگر مثل Student نیز باید عین همین متد را برای خود ( البته با محدوده بلاک مورد نیازشان) دوباره نویسی کنند.
جهت شرکت در دورههای زبان برنامه نویسی سیشارپ، از کد تخفیف heplc30 استفاده کنید.