آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 8 : abstract و sealed

در قسمت قبلی آموزش با مفهوم polymorphism آشنا شدیم. در ادامه قصد داریم با کلاس های abstract و sealed آشنا شویم. زمانی که شروع به نوشتن برنامه ای می کنیم، بعد از مشخص کردن موجودیت های برنامه و طراحی کلاس های مربوطه، باید یکسری محدودیت ها برای استفاده از کلاس ها وضع کرد. برای مثال، کلاس پایه ای داریم که این کلاس نباید مورد استفاده قرار بگیرد و تنها باید از کلاس های فرزند قابلیت ایجاد شئ وجود داشته باشد یا کلاسی نوشته ایم و نباید اجازه ایجاد کلاس فرزند از روی آن کلاس داده شود. این قابلیت ها بخصوص در مواقعی که در تیم شما، افرادی از کدهای نوشته شده توسط شما استفاده می کنند یا کدی را برای استفاده از سایر برنامه نویس ها بر روی اینترنت منتشر می کنید کاربرد دارند. راه حل برای این شرایط استفاده از کلاس های abstract و کلاس های sealed می باشد.

کلاس ها و اعضاء abstract

به بخش قبل و کلاس Shape بر میگردیم که سه کلاس فرزند از روی آن ها ساخته بودیم:

public class Shape
{
    public void Draw()
    {
        Console.WriteLine("Drawing the shape!");
    }
}

public class Rectangle : Shape
{
         
}
 
public class Triangle : Shape
{
         
}
 
public class Circle : Shape
{
         
}

کلاس Shape به تنهایی برای ما کاربردی نداشته و تنها داخل کد باید از کلاس های فرزند استفاده کرد، یعنی نباید از روی کلاس Shape شئ ایجاد شود. برای اینکار کافیست کلاس Shape را از نوع abstract تعریف کنیم:

public abstract class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("Drawing the shape!");
    }
}

حال اگر بخواهیم از روی کلاس Shape یک شئ ایجاد کنیم با پیغام خطا مواجه خواهیم شد:

i1

اما کاربرد کلاس های abstract به همین جا ختم نمی شود، در قسمت قبل متد Draw را در کلاس Shape به صورت virtual تعریف کرده و در کلاس های فرزند آن را override کردیم. یکی از قابلیت های زبان سی شارپ، تعریف متدها به صورت abstract می باشد. متدهای abstract تنها شامل signature که در قسمت های اولیه با آن آشنا شدیم می باشد و بدنه ندارد، علاوه بر آن تمامی کلاس هایی که از یک کلاس abstract مشتق می شوند، در صورتی که کلاس abstract رفتار یا خاصیتی از نوع abstract داشته باشد، باید حتماً آن رفتار یا خاصیت را override کنند. برای مثال کلاس Shape را به صورت زیر تغییر می دهیم:

public abstract class Shape
{
    public abstract void Draw();
}

همانطور که مشاهده می کنید، متد Draw تنها تعریف شده و بدنه ای ندارد. حال اگر کلاس فرزندی از کلاس Shape مشتق شود باید متد Draw داخل آن Override شود. در غیر اینصورت با پیغام خطا مواجه خواهیم شد:

i2

می توانیم به صورت دستی متد Draw را تعریف کرده یا از قابلیت Resharper برای پیاده سازی اعضای abstract به صورت خودکار استفاده کنیم. برای انکار مکان نما را بر روی نام کلاس قرار داده و کلید های Alt+Enter را فشار می دهیم. با این کار منویی با نام Action Context نمایش داده می شود:

i3

از منوی ظاهر شده، گزینه Implement missing members را انتخاب می کنیم تا اعضای abstract پیاده سازی شوند. بعد از اینکار کد کلاس Rectangle به صورت زیر خواهد بود:

public class Rectangle : Shape
{
    public override void Draw()
    {
        throw new NotImplementedException();
    }
}

کدی که به صورت خودکار داخل بدنه متد Draw قرار گرفته مربوط به یکی از ویژگی های زبان سی شارپ با نام استثناها یا Exceptions می باشد که در بخش های بعدی با آن آشنا می شویم. حال کد مورد نظر را داخل متد Draw می نویسیم:

public class Rectangle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("Drawing rectangle!");
    }
}

در صورتی که Resharper را نصب ندارید، برای پیاده سازی خودکار اعضاء abstract کلاس می توانید از قابلیت خود Visual Studio استفاده کنید. برای اینکار، مکان نما را به انتهای اول تعریف کلاس برده و کلید های Alt+. را فشار دهید. منویی به صورت زیر نمایش داده می شود:

i4

با انتخاب گزینه Implement abstract class Shape اعضاء ای که از نوع abstract تعریف شده اند در کلاس پیاده سازی می شوند.

این قابلیت دقیقاً کار مشابهی با متدهای virtual انجام می دهد، با این تفاوت که متدهای abstract بدنه ای ندارند، اما اعضاء virtual می توانند بدنه ای داشته باشند که بوسیله کلمه کلیدی base می توان به آنها در کلاس فرزند دسترسی داشت. همچنین توجه کنید که اعضاء abstract تنها داخل کلاس های abstract قابل تعریف هستند.

کلاس ها و اعضاء sealed

در قسمت وراثت گفتیم که می توان زنجیره وراثت داشت. یعنی کلاس B از کلاس A و کلاس C از کلاس B مشتق شوند. اما فرض کنید بخواهیم زنجیره وراثت را در یک کلاس قطع کنیم. یعنی کلاس دیگری نتواند از کلاس ما ارث بری کند. برای اینکار کافیست کلاس مورد نظر را از نوع sealed تعریف کرد:

public class A
{
        
}

public sealed class B : A
{
        
}

در کد بالا کلاس B از نوع sealed تعریف شده، بدین معنا که هیچ کلاس دیگری نمی تواند از این کلاس مشتق شود. در تصویر زیر، کلاس C از کلاس B مشتق شده و پیغام خطا دریافت کردیم:

i5

یکی دیگر از کاربردهای کلمه کلیدی sealed جلوگیری از override کردن یک متد است. کلاس Shape و Rectangle را مثال میزنیم. میخواهیم اگر کلاسی از کلاس Rectangle مشتق شد قابلیت ovverride ردن متد Draw را نداشته باشد. کافیست متد Draw را از نوع sealed تعریف کنیم:

public abstract class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("Drawing the shape!");
    }
}

public class Rectangle : Shape
{
    public sealed override void Draw()
    {
        Console.WriteLine("Drawing rectangle!");
    }
}

همانطور که در کد بالا مشاهده می کنید، متد Draw در کلاس Rectangle از نوع sealed تعریف شده. حالا اگر کلاسی تعریف کنیم و آن را کلاس Rectangle مشتق کنیم، در کلاس فرزند قابلیت تعریف مجدد متد Draw را نخواهیم داشت.تا این قسمت از آموزش با کلیات برنامه نویسی شئ گرا، مفاهیم وراثت و Polymorphism و همچنین کلاس های abstract و sealed آشنا شدیم. در بخش های بعدی با تکمیلی برنامه نویسی شئ گرا آَشنا شده و مباحث Casting را با هم بررسی خواهیم کرد. ITPRO باشید

نویسنده : حسین احمدی

منبع : جزیره برنامه نویسی وب سایت توسینسو

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است

#آموزش_زبان_سی_شارپ #برنامه_نویسی_شئ_گرا #دوره_آموزشی_سی_شارپ #آموزش_گام_به_گام_سی_شارپ #polymorphism_در_برنامه_نویسی_شئ_گرا #آموزش_برنامه_نویسی_شئ_گرا #کلاس_های_abstract_در_سی_شارپ #کلاس_های_sealed_در_سی_شارپ #برنامه_نویسی_شئ_گرا_چیست؟ #آموزش_برنامه_نویسی
عنوان
1 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 1 : مقدمه رایگان
2 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 2 : کلاس، اشیاء رایگان
3 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 3 : فیلد و رفتار رایگان
4 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 4 : Property ها رایگان
5 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 5 : ایجاد اشیاء رایگان
6 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 6 : وراثت رایگان
7 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 7 : Polymorphism رایگان
8 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 8 : abstract و sealed رایگان
9 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 9:سازنده در وراثت رایگان
10 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 10 : متد Extension رایگان
11 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 11: Value ها رایگان
12 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 12 : Interface رایگان
13 آموزش برنامه نویسی شی گرا در (#C) قسمت 13: Dependency Injection رایگان
14 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 14 : انواع Cast ها رایگان
15 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 15 : Operator Overloading رایگان
16 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 16 : Box و Unbox رایگان
17 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 17 : Generics رایگان
18 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 18 : List و Dictionary رایگان
19 آموزش برنامه نویسی شی گرا در سی شارپ (#C) قسمت 19 : مدیریت خطاها رایگان
زمان و قیمت کل 0″ 0
5 نظر
سلمان بدرقه

متشکرم اقای مهندس راستی چند قسمت هست اموزش سی شارپ

حسین احمدی

تو قسمت مقدمه کلیت دوره رو نوشتم، تصمیم دارم بعد از اتمام دوره Database، آموزش ASP.NET MVC به همراه WebAPI و AngularJS رو شروع کنم. اما تا انتهای دوره بانک اطلاعاتی، فکر کنم بیشتر از 70 قسمت بشه که تو سه سری جداگانه تو سایت قرار میدم:

  1. آموزش مقدماتی سی شارپ که در حال نگارش هست
  2. دوره پیشرفته
  3. برنامه نویسی بانک های اطلاعاتی
علیرضا موسوی

سلام آقای مهندس میخواستم بپرسم چرا در مورد اینترفیس ها که خیلی مهم هستند چیزی گفته نشده....

چون میبایستی مبحث اینترفیس ها بعد از وراثت گفته شود.

با عرض معذرت

حسین احمدی

دوست عزیز، فعلاً در حال به روز رسانی نرم افزار انجمن هستم، به زودی بخش های بعدی که interface ها هم جزوش هست رو شروع میکنم.

جلال مقدم

سوال : برای توسعه برنامه های سی شارپ، محیطی غیر از ویژوال استودیو وجود دارد؟ مثل نت بینز در جاوا...

محیطی سبک تر ولی با قابلیت ادیتور و کامپایل ویژوال

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....